![](/img/trans.png)
[英]Binding Datagrid to ObservableCollection<T> in SIlverlight
[英]Async modification of ObservableCollection<T> not represented in DataGrid
自從我使用Forms / WPF以來已經有一段時間了。 如果這是一個愚蠢的問題,請原諒。
我有一個名為myObservable
的ObservableCollection<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.