您好我有這勢必與TrulyObservableCollection
,每當我試圖通過爲textInput的DataGrid單元格編輯單元格失去專注每個鍵後輸入一個WPF的DataGrid,WPF的Datagrid與TrulyObservableCollection失去專注於編輯
public sealed class TrulyObservableCollection<T> : ObservableCollection<T>
where T : INotifyPropertyChanged
{
public TrulyObservableCollection()
{
CollectionChanged += FullObservableCollectionCollectionChanged;
}
public TrulyObservableCollection(IEnumerable<T> pItems)
: this()
{
foreach (var item in pItems) {
this.Add(item);
}
}
private void FullObservableCollectionCollectionChanged(object sender,
NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null) {
foreach (Object item in e.NewItems) {
((INotifyPropertyChanged)item).PropertyChanged += ItemPropertyChanged;
}
}
if (e.OldItems != null) {
foreach (Object item in e.OldItems) {
((INotifyPropertyChanged)item).PropertyChanged -= ItemPropertyChanged;
}
}
}
private void ItemPropertyChanged(object sender, PropertyChangedEventArgs e)
{
try {
var a = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
OnCollectionChanged(a);
}
catch {
// ignored
}
}
}
下面是我的視圖模型,這是綁定到Datagrid的,
public TrulyObservableCollection<SubLotModel> SubLotCollection
{
get { return _subLotCollection; }
set
{
_subLotCollection = value;
NotifyOfPropertyChange(() => SubLotCollection);
SerialNumberAdded = _subLotCollection.Count;
}
}
在DataGrid我有被綁定在SublotCollection數量屬性的文本框列,
<DataGridTemplateColumn Header="Quantity">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Quantity, ValidatesOnDataErrors=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
只要我在texbox列中鍵入一個有效的鍵,單元失去焦點。
我的猜測是,每次在信視圖模型輸入時間'Quantity'屬性更新了引發'PropertyChanged'事件,這會導致您的'TrulyObservableCollection'通過'NotifyCollectionChangedAction.Reset'引發'CollectionChanged',從而導致'DataGrid'重建自身,導致以前集中的編輯器失去焦點(可能不是甚至是同一個編輯器,但是新創建的實例在它的位置)。 – Grx70
@ Grx70:好點。但是,爲什麼每當項目的屬性發生變化時,您(OP)都會發起重置事件,即使用TrulyObservableCollection類的目的是什麼? – mm8
我正在使用TrulyObservable集合,以便收集集合中的項目時也能收到通知。 – Vinay