[英]Programmatically bind an ObservableCollection to a ListBox
這個問題看起來像這樣:以編程方式將List綁定到ListBox,但是就我的示例而言,本文中給出的答案對我不起作用! 無論如何,我看了大約10/15個類似的帖子,但都沒有用
這是我的xaml代碼:
<Grid>
<ListBox Name="ListBoxx"/>
</Grid>
這是背后的代碼:
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ObservableCollection<string> MyCollection = new ObservableCollection<string>();
Random random = new Random();
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += (sender, e) =>
{
MyCollection.Add(random.Next(0, 100).ToString());
};
aTimer.Interval = 500;
aTimer.Enabled = true;
Binding myBinding2 = new Binding();
myBinding2.Source = this;
myBinding2.Path = new PropertyPath("MyCollection");
ListBoxx.SetBinding(ListBox.ItemsSourceProperty, myBinding);
}
}
}
據我所知,我的類不必繼承自INotifyPropertyChanged,因為我使用的是ObservableCollection。
我不想在xaml代碼中使用{Binding}。
我嘗試了這段代碼:
ListBoxx.ItemsSource = MyCollection;
這個“工作”,但我遇到了線程崩潰。 我知道我可以使用Dispatcher對其進行修復,但不能用我的代碼修復。 我想像我的代碼片段一樣使用“真實”綁定(可配置)。
結果是我沒有錯誤,但ListBox卻沒有更新:/
我試圖添加以下行:
MyCollection.Add("aaa");
MyCollection.Add("bbb");
MyCollection.Add("ccc");
MyCollection.Add("ddd");
但是我的應用程序什么都沒得到,所以我真的認為這是一個有約束力的問題。 無論如何,我確定我的計時器正常,問題不在這里。
我也試圖像這樣將MyCollection作為Property獲取:
private ObservableCollection<string> _MyCollection = new ObservableCollection<string>();
public ObservableCollection<string> MyCollection { get { return _MyCollection; } }
但是它也不起作用:/(沒有錯誤但沒有更新)
您發布的代碼將失敗,因為“ MyCollection”不是MainWindow中的屬性。 您的Visual Studio輸出窗口可能顯示綁定錯誤。
另外,您確實確實需要分派對集合所做的更改,可以使用DispatcherTimer來執行此操作。 在輸出窗口中也應該有關於此的錯誤。
以下代碼有效:
public partial class MainWindow : Window
{
public ObservableCollection<string> MyCollection { get; set; }
public MainWindow()
{
InitializeComponent();
MyCollection = new ObservableCollection<string>();
Random random = new Random();
DispatcherTimer aTimer = new DispatcherTimer();
aTimer.Tick += (sender, e) =>
{
MyCollection.Add(random.Next(0, 100).ToString());
};
aTimer.Interval = new TimeSpan(0,0,0,0,500);
aTimer.Start();
Binding myBinding2 = new Binding();
myBinding2.Source = this;
myBinding2.Path = new PropertyPath("MyCollection");
ListBoxx.SetBinding(ListBox.ItemsSourceProperty, myBinding2);
}
}
第一種情況不能工作,因為綁定僅對屬性有效。 如果創建一個如最后所示的屬性,則它應該可以工作,當然要考慮到綁定對象的DataContext
或Binding.Source
是包含該屬性的對象。
您會遇到綁定錯誤嗎? 您是否嘗試調試它 ?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.