WPF组合框未显示动态更改的选定项

时间:2018-03-18 15:35:33

标签: wpf combobox

我正在尝试根据另一个组合框中的更改来更改组合框的选定项目。由于两个组合框都出现在项目模板列表中,因此情况变得复杂。

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");
}

然而,这也不起作用。

任何帮助非常感谢。 罗杰。

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,那么您希望observablecollection中的更改值能够在UI中反映出来。这不会发生。当集合本身发生变化时,observablecollections会引发notifyproperty事件,而不是当集合中的值发生变化时。您需要在值更改时引发notifyproperty事件,或者从列表中删除该项并使用新值将其添加回来。