【问题标题】:combobox selection triggers another combobox selection etc. in WPF组合框选择在 WPF 中触发另一个组合框选择等
【发布时间】:2017-02-07 23:08:46
【问题描述】:

我知道以前有人问过这个问题,但由于某种原因,它似乎在某种程度上只对我有用。我这样设置我的 XAML:

    <Grid>
        <ComboBox x:Name="cbCategories" ItemsSource="{Binding Categories}" DisplayMemberPath="Name" SelectedIndex="{Binding SelectedCategoryIndex}"/>
        <ComboBox x:Name="cbSourceParam" ItemsSource="{Binding SourceParameters}" DisplayMemberPath="Name" SelectedIndex="{Binding SelectedSourceParameterIndex}"/>
        <ComboBox x:Name="cbTargetParam" ItemsSource="{Binding TargetParameters}" DisplayMemberPath="Name" SelectedIndex="{Binding SelectedTargetParameterIndex}"/>
    </Grid>

然后我的 ViewModel 是这样的:

public class pmCopyParamToParamViewModel : ViewModelBase
    {
        public pmModel model;
        public ObservableCollection<CategoryWrapper> Categories { get; private set; }

        public pmCopyParamToParamViewModel(Document doc)
        {
            this.model = new pmModel(doc);
            this.Categories = model.CollectCategories();
            SelectedCategoryIndex = 0;
        }

        private ObservableCollection<ParameterWrapper> _sourceParameters;
        public ObservableCollection<ParameterWrapper> SourceParameters
        {
            get { return _sourceParameters; }
            set
            {
                if (_sourceParameters == value) return;

                _sourceParameters = value;
                RaisePropertyChanged(() => SourceParameters);
                SelectedSourceParameterIndex = 0;
            }
        }

        private ObservableCollection<ParameterWrapper> _targetParameters;
        public ObservableCollection<ParameterWrapper> TargetParameters
        {
            get { return _targetParameters; }
            set
            {
                if (_targetParameters == value) return;

                _targetParameters = value;
                RaisePropertyChanged(() => TargetParameters);
                SelectedTargetParameterIndex = 0;
            }
        }

        // logic for selected category index
        private int _selectedCategoryIndex;
        public int SelectedCategoryIndex
        {
            get { return _selectedCategoryIndex; }
            set
            {
                if (_selectedCategoryIndex == value) return;

                _selectedCategoryIndex = value;
                RaisePropertyChanged(() => SelectedCategoryIndex);
                SourceParameters = model.CollectParameters(Categories[SelectedCategoryIndex].ID, new string[] { "String", "Double", "Integer" });
            }
        }

        private int _selectedSourceParameterIndex;
        public int SelectedSourceParameterIndex
        {
            get { return _selectedSourceParameterIndex; }
            set
            {
                if (_selectedSourceParameterIndex == value) return;

                _selectedSourceParameterIndex = value;
                RaisePropertyChanged(() => SelectedSourceParameterIndex);
                TargetParameters = model.CollectParameters(Categories[SelectedCategoryIndex].ID, new string[] { SourceParameters[SelectedSourceParameterIndex].StorageType });
            }
        }

        private int _selectedTargetParameterIndex;
        public int SelectedTargetParameterIndex
        {
            get { return _selectedTargetParameterIndex; }
            set
            {
                if (_selectedTargetParameterIndex == value) return;

                _selectedTargetParameterIndex = value;
                RaisePropertyChanged(() => SelectedTargetParameterIndex);
            }
        }
    }

我期望发生的是,在 ViewModel 初始化时,它会收集所有类别。然后我调用SelectedCategoryIndex 并将其设置为0。这反过来应该触发SourceParameters 更新并将所选项目最初设置为0。这反过来又会触发TargetParameters 触发并将初始SelectedParameterIndex 设置为0 .

到目前为止,我只看到设置了类别和源参数,但目标参数组合框直到我手动触摸/更改源参数组合框的选择才设置。

我在这里错过了什么吗?谢谢!

【问题讨论】:

    标签: c# wpf xaml mvvm combobox


    【解决方案1】:

    这可能是问题吗?

    private int _selectedSourceParameterIndex; // Starts off as 0
    public int SelectedSourceParameterIndex
    {
        set
        {
            // Setting to zero would not change the value, and this will return
            if (_selectedSourceParameterIndex == value) return;
    
            //... nothing here gets executed ...
            _selectedSourceParameterIndex = value;
            RaisePropertyChanged(() => SelectedSourceParameterIndex);
            TargetParameters = model.CollectParameters(Categories[SelectedCategoryIndex].ID, new string[] { SourceParameters[SelectedSourceParameterIndex].StorageType });
        }
    }
    

    我个人更喜欢绑定SelectedItem 而不是SelectedIndex。它会为您提供实际对象(如果未选择任何对象,则为 null),因此您不必处理组合框/列表索引的复杂性。

    【讨论】:

    • 你是对的。这正是正在发生的事情。我将绑定切换到SelectedItem,现在它工作得很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多