这个问题看起来像这样: Programmatically binding List to 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作为属性,如下所示:
private ObservableCollection<string> _MyCollection = new ObservableCollection<string>();
public ObservableCollection<string> MyCollection { get { return _MyCollection; } }
但它也不起作用:/(没有错误但没有更新)
答案 0 :(得分:6)
您发布的代码将失败,因为“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);
}
}
答案 1 :(得分:2)
第一种情况不起作用,因为绑定仅适用于属性。如果您创建一个属性,如最后所示它应该工作,当然,绑定对象的DataContext
或Binding.Source
是包含该属性的对象。
你得到绑定错误吗?你试过debug it吗?