关于mvvm的ComboBox绑定SelectedValue值不正确问题

本文探讨了在MVVM模式下ComboBox绑定SelectedValue时可能出现的问题。使用ObservableCollection而非List与页面交互以实现双向绑定。关键在于指定DisplayMemberPath和SelectedValuePath,分别用于显示内容和存储选中值。若不设置,可能显示为类型名称。同时,通过TwoWay模式绑定SelectedIndex和SelectedValue,确保前后端数据同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的自定义下拉对象

    public class ComboBoxModel
    {
        //基础属性
        public int SelectedIndex { get; set; }
        public string SelectedValue { get; set; }

        //附加属性
        public string ImagePath { get; set; }
        public bool IsSelected { get; set; }

        //码表属性
        public int Id { get; set; }
        public int SortNumber { get; set; }
        public int NodeKey { get; set; }
        public string NodeCode { get; set; }
        public string NodeName { get; set; }

        //构造函数
        public ComboBoxModel()
        {
            SelectedIndex = 0;
            SelectedValue = null;
        }
        public ComboBoxModel(int index, string value)
        {
            SelectedIndex = index;
            SelectedValue = value;
        }

    }
在viewModel中的绑定参数

        public ObservableCollection<ComboBoxModel> CardType { get; set; }
        public ComboBoxModel CardTypeSelected { get; set; }

前端页面

<ComboBox Grid.Row="3" Grid.Column="4" 
	VerticalAlignment="Center"  VerticalContentAlignment="Center" 
	ItemsSource="{Binding DataContent.CardType}"
	DisplayMemberPath="SelectedValue" 
	SelectedValuePath="SelectedValue"
	SelectedIndex="{Binding DataContent.CardTypeSelected.SelectedIndex,Mode=TwoWay}"
	SelectedValue="{Binding DataContent.CardTypeSelected.SelectedValue,Mode=TwoWay}"
/>


我的ItemsSource绑定的是一个ComboBoxModel类型的对象列表,就是要告诉页面我的下拉菜单里每个选项是什么内容

ItemsSource="{Binding DataContent.CardType}"

这里ObservableCollection<ComboBoxModel>和List<ComboBoxModel>意义相同,但是在MVVM里前者可与页面绑定互动,所以尽量用前者

在这个对象列表中的每一个选项本身是一个ComboBoxModel类型,且有两个属性:

SelectedIndex

SelectedValue

所以我需要明确告诉前端页面我显示的路径是哪里,选中参数的存储路径又是哪里

DisplayMemberPath="SelectedValue" //显示成员的路径

SelectedValuePath="SelectedValue"//选中参数的路径

所以在指定这两项后,前端下拉菜单才能正确的显示ItemsSource的内容

如果不设置这两个路径,前端页面就不知道这个自定义ComboBoxModel对象究竟要显示什么,很大可能性你得到的一个结果就是一长串ComboBoxModel的类型描述字符串

然后就可以绑定具体的接收SelectedIndex和SelectedValue的参数了,例如:

SelectedIndex="{Binding DataContent.CardTypeSelected.SelectedIndex,Mode=TwoWay}"
SelectedValue="{Binding DataContent.CardTypeSelected.SelectedValue,Mode=TwoWay}"

因为设置了TwoWay,所以若你的上下文DataContent实现双工接口的情况下就可以在后端更新前端数据了

public class ShowDialogEmployeeModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnChangedProperties(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    }

上面代码是DataContent的双工接口举例









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值