ComboBox SelectedItem 值绑定不会设置为 null 以外的任何值

ComboBox SelectedItem value binding will not set to anything other than null

提问人:PuddleJumper1357 提问时间:11/16/2023 更新时间:11/17/2023 访问量:37

问:

我正在尝试创建一个MVVM程序。当按下单选按钮时,它将取消选择其他单选按钮,并根据按下的单选按钮将组合框的内容更改为不同的值。然后,它将使用所选值来设置字符串。我遇到的问题是绑定到 SelectedItem 的值始终为 null,并且会引发错误。如何解决此问题?

作为一端,而不是组合框,确实正确显示整个列表,因此 ItemsSource 的绑定工作正常,并且 SelectedIndex 也正确更新,只有 SelectedItem 似乎没有正确绑定。

现在我正在考虑使用 selectedindex 工作,我可以使用该值从适当的字符串列表中进行选择,但我想知道发生了什么以及为什么我不能使用 SelectedItem,以及是否有办法使用 SelectedItem。

希望下面的代码是我的代码中发生的事情的简化版本,我希望我没有错过任何东西。

XAML

<RadioButton Grid.Column="0" Content="List1" IsChecked="{Binding Path=TypeList1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<RadioButton Grid.Column="1" Content="List2" IsChecked="{Binding Path=TypeList2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<RadioButton Grid.Column="2" Content="List3" IsChecked="{Binding Path=TypeList3, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>

<ComboBox Margin="5" 
          ItemsSource="{Binding Path=MySource}"
          SelectedItem="{Binding Path=MySelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          SelectedIndex="{Binding Path=MySelectedIndex,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          />

C#

Class MyClass
{
    private list<string> _listType;
    private list<string> _mySource;
    private bool _typeList1;
    private bool _typeList2;
    private bool _typeList3;
    private ComboBoxItem _mySelectedItem;
    private int _mySelectedIndex;
    
    public list<string> ListType
    {
        get{ return _listType;}
        set{ _listType=value; OnPropertyChanged(nameof(ListType));
    }

    public bool TypeList1
    {
        get{return _typeList1;}
        set
        {
            _typeList1=value; 
            OnPropertyChanged(nameof(TypeList1));
            if(value==true)
            {
                MySource=List1;
                TypeList2=false;
                TypeList3=false;
            }   
        }
    }
    public bool TypeList2
    {
        get{return _typeList2;}
        set
        {
            _typeList2=value; 
            OnPropertyChanged(nameof(TypeList2));
            if(value==true)
            {
                MySource=List2;
                TypeList1=false;
                TypeList3=false;
            }   
        }
    }
    public bool TypeList3
    {
        get{return _typeList3;}
        set
        {
            _typeList3=value; 
            OnPropertyChanged(nameof(TypeList3));
            if(value==true)
            {
                MySource=List3;
                TypeList2=false;
                TypeList1=false;
            }   
        }
    }
    
    public list<string> MySource
    {
        get{ return _mySource;}
        set{ _mySource=value; OnPropertyChanged(nameof(MySource));
    }
    public ComboBoxItem MySelectedItem
    {
        get{ return _mySelectedItem;}
        set{ _mySelectedItem=value; OnPropertyChanged(nameof(MySelectedItem));
    }

    public int MySelectedIndex
    {
        get{ return _mySelectedIndex;}
        set{_mySelectedIndex=value; OnPropertyChanged(nameof(MySelectedIndex));
    }

    public List<string> List1=new List<string> {"List1Val1", "List1Val2", "List1Val3",};
    public List<string> List2=new List<string> {"List2Val1", "List2Val2", "List2Val3","List2Val4"};
    public List<string> List3=new List<string> {"List3Val1", "List3Val2", "List3Val3",};
    
    public MyClass()
    {
        MySource= new List<string>();
        ListType= new List<string>();
    }
    
    public void MyFunction()
    {
        string mySelectedValueFromComboBox= MySelectedItem.content.ToString();// where the error happens when the code is run.
    }
}

发生的错误是: System.NullReferenceException:“对象引用未设置为对象的实例。

FileName.mySelectedValueFromComboBox.get 返回 null。

我所期望的是MyFunction中的字符串值设置为所选ComboBoxItem的字符串值。

在代码的另一部分中,我在 XAML 中而不是在 C# 中定义了 ComboBoxItems,并且此方法在那里起作用。

C# XAML MVVM

评论

1赞 Klaus Gütter 11/17/2023
你的项目是字符串,所以最好是字符串ComboBoxItem MySelectedItemstring MySelectedItem
0赞 PuddleJumper1357 11/17/2023
据我了解,ComboBox 中的 SelectedItem 返回一个 ComboBoxItem,这不对吗?
0赞 emoacht 11/17/2023
不。它是源集合中的项,对应于选定的 ComboBoxItem。
0赞 PuddleJumper1357 11/17/2023
只是把它改成一根绳子,这起作用了,谢谢你@KlausGütter现在觉得自己像个白痴。

答:

0赞 PuddleJumper1357 11/17/2023 #1

谢谢 Klaus Gütter 和 emoacht 在评论中,我能够将 ComboBoxItem 更改为字符串,这使我能够运行代码并为我提供预期的正确输出。