对象的引用更改后通知 UI
Notifying UI once the reference of an Object is changed
我正在尝试将对象内部的部件列表中的选定部件绑定为 ObservableCollection。
<UserControl.DataContext>
<MultiBinding Converter="{StaticResource getPartConverter}">
<Binding Path="PartType" ElementName="PartDisplayUserControl"/>
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=local:MainWindow}" Path="ViewModelForParts"/>
</MultiBinding>
</UserControl.DataContext>
一旦 PartList (ObservableCollection) 发生变化,它就不会触发转换器 (getPartConverter)。但是一旦 PartType 发生变化,它就会触发转换器并找到正确的部分。更改零件列表后如何触发转换器?
ViewModelForParts 的代码如下:
public class PartConfiguratorViewModel : PropertyChangedViewModelBase
{
private ObservableCollection<PartData> partList;
public ObservableCollection<PartData> PartList
{
get => partList;
set => SetField(ref partList, value);
}
public PartConfiguratorViewModel()
{
PartList = new ObservableCollection<PartData>();
}
}
注意:setField 命令具有 属性 更改事件。此外,PartData 对象中的所有属性也具有相同的事件。
您应该绑定到一个 属性,它在集合更新时实际设置,例如 Count
属性:
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=local:MainWindow}"
Path="ViewModelForParts.Count"/>
绑定到集合 属性 本身只会在您将 PartList
属性 设置为另一个集合时触发转换器(这违背了使用 ObservableCollection<T>
的目的在另一种不引发 INotifyCollectionChanged
事件的集合上)
我正在尝试将对象内部的部件列表中的选定部件绑定为 ObservableCollection。
<UserControl.DataContext>
<MultiBinding Converter="{StaticResource getPartConverter}">
<Binding Path="PartType" ElementName="PartDisplayUserControl"/>
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=local:MainWindow}" Path="ViewModelForParts"/>
</MultiBinding>
</UserControl.DataContext>
一旦 PartList (ObservableCollection) 发生变化,它就不会触发转换器 (getPartConverter)。但是一旦 PartType 发生变化,它就会触发转换器并找到正确的部分。更改零件列表后如何触发转换器?
ViewModelForParts 的代码如下:
public class PartConfiguratorViewModel : PropertyChangedViewModelBase
{
private ObservableCollection<PartData> partList;
public ObservableCollection<PartData> PartList
{
get => partList;
set => SetField(ref partList, value);
}
public PartConfiguratorViewModel()
{
PartList = new ObservableCollection<PartData>();
}
}
注意:setField 命令具有 属性 更改事件。此外,PartData 对象中的所有属性也具有相同的事件。
您应该绑定到一个 属性,它在集合更新时实际设置,例如 Count
属性:
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=local:MainWindow}"
Path="ViewModelForParts.Count"/>
绑定到集合 属性 本身只会在您将 PartList
属性 设置为另一个集合时触发转换器(这违背了使用 ObservableCollection<T>
的目的在另一种不引发 INotifyCollectionChanged
事件的集合上)