簡體   English   中英

ObservableCollection的異步修改 <T> 未在DataGrid中表示

[英]Async modification of ObservableCollection<T> not represented in DataGrid

自從我使用Forms / WPF以來已經有一段時間了。 如果這是一個愚蠢的問題,請原諒。

我有一個名為myObservableObservableCollection<myClass> ,其中myClass包含以下內容:

public class myClass
{
    public string myStringOne { get; set; }
    public string myStringTwo { get; set; }
    public string myStringThree { get; set; }
    public string mystringFour { get; set; }
}

並在UI.xaml中進行以下控制。

<Grid HorizontalAlignment="Left" Height="239" VerticalAlignment="Top" Width="439">
    <DataGrid x:Name="PhoneGrid" VerticalAlignment="Top" Height="134"
              CanUserReorderColumns="False" 
              CanUserResizeColumns="False" 
              CanUserResizeRows="False" 
              CanUserSortColumns="False" 
              Focusable="False" 
              IsReadOnly="True"
        DataContext="{Binding RelativeSource={RelativeSource AncestorType=Window}}"
        ItemsSource="{Binding myObservable}" MouseLeftButtonUp="PhoneGrid_MouseLeftButtonUp" SelectionUnit="Cell" Margin="10,100,10,0" />

我設置背景工作人員的方式:

private readonly BackgroundWorker _worker = new BackgroundWorker();
private readonly object _lock = new object();
_worker.DoWork += LoadLines;
var timer = new Timer(Settings.Default.Interval);
timer.Elapsed += timer_Elapsed;
timer.Start();

LoadLines是我在UI中阻止事物的功能。

我試圖實現類似

// Prepare obervable collection
BindingOperations.EnableCollectionSynchronization(myObservable, _lock);

以及

Dispatcher.Invoke(() => {
    myObservable[index].myString = "anyStr";
});

當我從myObservable添加和刪​​除myClass時,它可以工作。 但是,當我更改myClass的屬性時,即使myObservable的值已更改,更改也不會反映在WPF DataGrid中。

我想念什么?

我嘗試了其他幾種來源,但無濟於事。 似乎有可能在UI線程以外的其他線程上修改集合。 而且,我無法在新線程上運行或在UI線程上調用它時在行為上有任何區別。

您的myClass需要實現INotifyPropertyChanged。 這就是WPF數據綁定如何通知UI屬性更改的方式。

public class myClass: INotifyPropertyChanged
{
    private string _myStringOne;
    public string myStringOne { 
       get { return _myStringOne; } 
       set 
       {
           if(_myStringOne != value)
            {
                  _myStringOne = value;
                  NotifyPropertyChanged("myStringOne");
            }
      }
   }

   public event PropertyChangedEventHandler PropertyChanged;

   public void NotifyPropertyChanged(string propName)
   {
        if(this.PropertyChanged != null)
             this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
   }
}

暫無
暫無

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

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