繁体   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