我正在尝试创建一个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#中定义了ComboBoxItem,这个方法在那里工作。
1条答案
按热度按时间50few1ms1#
感谢Klaus Gütter和emoacht在评论中,我能够将ComboBoxItem更改为字符串,这使我能够运行代码并给予我预期的正确输出。