簡體   English   中英

以編程方式將ObservableCollection綁定到ListBox

[英]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);
    }
}

第一種情況不能工作,因為綁定僅對屬性有效。 如果創建一個如最后所示的屬性,則它應該可以工作,當然要考慮到綁定對象的DataContextBinding.Source是包含該屬性的對象。

您會遇到綁定錯誤嗎? 您是否嘗試調試它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM