gpt4 book ai didi

c# - 在没有 INotifyPropertyChanged 的​​情况下更新 ObservableCollection 成员属性的绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 10:27:54 25 4
gpt4 key购买 nike

我有一个 WPF View绑定(bind)到 ViewModel实现 INotifyPropertyChanged .在那View , 我有一个 DataGrid ,其项目绑定(bind)到 ObservableCollectionViewModel . ObservableCollection成员自己不执行INotifyPropertyChanged .在 DataGrid我有三列 - 两列可编辑 DatePicker列和只读 Checkbox当用户选择包含当前日期的日期范围时,应检查该列。

首次加载 View 时绑定(bind)工作,但 Checkbox 的绑定(bind)当我更改其他两列中的日期时没有更新,大概是因为类 MyDomainObject未实现 INotifyPropertyChanged .我真的不想在这里实现那个接口(interface),因为 ObservableCollection是从 Web 服务返回的类型,这样做会迫使我创建和维护该类型的副本,并且我的应用程序中有很多类似的场景。有什么办法可以强制复选框更新?如果可能的话,我非常希望避免使用后面的代码——如果我必须打破这条规则,我知道该怎么做。

以下代码应大致说明问题:

XAML:

<DataGrid ItemsSource="{Binding MyDomainObjectCollection}">
<DataGrid.Columns>

<DataGridTemplateColumn Header="Start Date">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding StartDate, StringFormat=d}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<DatePicker SelectedDate="{Binding StartDate, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

<DataGridTemplateColumn Header="End Date">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding EndDate, StringFormat=d}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<DatePicker SelectedDate="{Binding EndDate, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

<DataGridTemplateColumn Header="Is Active">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsActive, Mode=OneWay}" IsEnabled="False" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

</DataGrid.Columns>
</DataGrid>

查看型号:
public class MyViewModel : INotifyPropertyChanged {

ObservableCollection<MyDomainObject> _myDomainObjectCollection;

public ObservableCollection<MyDomainObject> MyDomainObjectCollection {
get { return this._myDomainObjectCollection; }
set { this._myDomainObjectCollection = value; this.OnPropertyChanged(); }
}

[...]

}

域对象:
public class MyDomainObject {

public DateTime StartDate { get; set; }

public DateTime EndDate { get; set; }

public bool IsActive {
get { return StartDate < DateTime.Now && EndDate > DateTime.Now; }
}

}

最佳答案

如果您不想实现 INotifyPropertyChanged域对象上的接口(interface),您可以使用与您的 DomainObject 具有相同接口(interface)并实现 INotifyPropertyChanged 的​​ ViewModel 包装您的 DomainObject

public class MyDomainObjectViewModel : INotifyPropertyChanged {

private MyDomainObject _domainObject;

public MyDomainObjectViewModel(MyDomainObject domainObject){
_domainObject = domainObject;
}

public DateTime StartDate {
get{
return _domainObject.StartDate;
}
set{
_domainObject.StartDate = value;
RaisePropertyChanged("StartDate");
RaisePropertyChanged("IsActive");
}
}

public DateTime EndDate {
get{
return _domainObject.EndDate ;
}
set{
_domainObject.EndDate = value;
RaisePropertyChanged("EndDate");
RaisePropertyChanged("IsActive");
}
}

public bool IsActive {
get { return StartDate < DateTime.Now && EndDate > DateTime.Now; }
}

}

您的 ObservableCollection 将是 ObservableCollection<MyDomainObjectViewModel> 类型.

关于c# - 在没有 INotifyPropertyChanged 的​​情况下更新 ObservableCollection 成员属性的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29340139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com