我正在尝试根据另一个组合框中的更改来更改组合框的选定项目。由于两个组合框都出现在项目模板列表中,因此情况变得复杂。
XAML如下:
<ListBox ItemsSource="{Binding AncillaryExtendedPropertyViewModels}" ItemTemplateSelector="{StaticResource templateSelector}"/>
<DataTemplate x:Key="EnumDataTemplate"> <Grid Margin="4"
MinHeight="25"> <ComboBox SelectedItem="{Binding ExtendedPropertyEnum,
UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
ItemsSource="{Binding ExtendedPropertyEnumList}"
DisplayMemberPath="Value"/> </Grid> </DataTemplate>
包含XAML的视图的数据上下文设置为AncillaryBaseViewModel。以下是AncillaryBaseViewModel的缩减版本。
public class AncillaryBaseViewModel : ComplexOrderItemViewModel, IDataErrorInfo
{
private ObservableCollection<ExtendedPropertyViewModel> _ancillaryExtendedPropertyViewModels;
public ObservableCollection<ExtendedPropertyViewModel> AncillaryExtendedPropertyViewModels
{
get { return _ancillaryExtendedPropertyViewModels; }
set
{
_ancillaryExtendedPropertyViewModels = value;
OnPropertyChanged("AncillaryExtendedPropertyViewModels");
}
}
和ExtendedPropertyViewModel类....
public class ExtendedPropertyViewModel : DataTemplateSelector
{
private ExtendedProperty _extendedProperty;
public DataTemplate DefaultnDataTemplate { get; set; }
public DataTemplate BooleanDataTemplate { get; set; }
public DataTemplate EnumDataTemplate { get; set; }
public ExtendedPropertyEnum ExtendedPropertyEnum
{
get
{ return ExtendedProperty.ExtendedPropertyEnum; }
set
{
if (ExtendedProperty.ExtendedPropertyEnum != value)
{
_extendedProperty.ExtendedPropertyEnum = value;
AncillaryBaseViewModel parent = RequestParent();
if (parent != null)
{
parent.AncillaryExtendedPropertyViewModels[7].ExtendedPropertyEnum =
ExtendedProperty.ExtendedPropertyEnum.DependentExtendedPropertyEnums[0];
}
parent.OrderItem.SetStockCode();
PropertyChanged += parent.OnExtendedPropertyChanged;
OnPropertyChanged();
}
}
}
和ExtendedProperty类......
public class ExtendedProperty : ViewModelBase
{
private ExtendedPropertyEnum _extendedPropertyEnum;
public int ExtendedPropertyID { get; set; }
public int OrderItemTypeID { get; set; }
public string DisplayName {get; set;}
public ObservableCollection<ExtendedPropertyEnum> ExtendedPropertyEnumList { get; set; }
public string Value { get; set; }
public ExtendedPropertyEnum ExtendedPropertyEnum
{
get
{
return _extendedPropertyEnum;
}
set
{
_extendedPropertyEnum = value;
OnPropertyChanged("ExtendedPropertyEnum");
}
}
}
总而言之,当我通过UI更改组合框A的值时,它会调用ExtendedPropertyViewModel中的ExtendedPropertyEnum setter,这会将ExtendedPropertyEnum绑定到另一个组合框B,该组合框B位于同一列表中。我希望这会相应地更新组合框B中显示的值,但事实并非如此。 另外,更改组合框A的值会更新不在数据模板中的标签。这个标签的XAML是....
<Label Content="{Binding StockCode}" MinWidth="100"/>
这是由AncillaryBaseViewModel ....
中的以下代码更新的public void OnExtendedPropertyChanged(object sender, EventArgs args)
{
OnPropertyChanged("StockCode");
}
我以为我可以将其更改为以下内容以强制更新列表中的组合框。
public void OnExtendedPropertyChanged(object sender, EventArgs args)
{
OnPropertyChanged("StockCode");
OnPropertyChanged("AncillaryExtendedPropertyViewModels");
}
然而,这也不起作用。
任何帮助非常感谢。 罗杰。
答案 0 :(得分:0)
如果我正确理解了这个问题,那么您希望observablecollection中的更改值能够在UI中反映出来。这不会发生。当集合本身发生变化时,observablecollections会引发notifyproperty事件,而不是当集合中的值发生变化时。您需要在值更改时引发notifyproperty事件,或者从列表中删除该项并使用新值将其添加回来。