首先,我尝试了很多搜索,但如果我的Google-fu似乎缺乏搜索,请随时立即将我链接到另一篇将要回答的文章/问题。
我似乎误解了SelectedItem / SelectedValue的用法,尽管我已经阅读了多篇关于它们的文章和问题。可能我试图将ComboBox绑定装入一些它本身并不应该的东西。
public class MappedValue
{
public string Representation
{
get;
set;
}
public object Value
{
get;
set;
}
}
public class ParameterValue
{
public object Value
{
get;
set;
}
}
<ComboBox ItemsSource="{Binding Path=MappedValues}"
DisplayMemberPath="Representation"
SelectedItem="{Binding Path=ParameterValue.Value}"
SelectedValue="{Binding Path=ParameterValue}"
SelectedValuePath="Value"/>
'MappedValues'只是一个集合。
所以我要做的是从选定的MappedValue中提取'Value'属性并将其存储在'ParameterValue.Value'中。
因此,实际上,它需要整个选定的MappedValue对象(而不是'MappedValue.Value'属性)并将其设置为'ParameterValue.Value'。
我不理解这些组合框属性的功能,或者使用XAML和ComboBox没有简单的方法吗?
答案 0 :(得分:1)
在我的例子中,我使用了一个ObservableCollection来存储Person类的列表。如果您实现了属性更改接口,则可以将所选项目设置为后面代码中的属性。这样,您就可以完全访问列表中对象的属性。 我希望这有帮助
的Xaml
<ComboBox x:Name="comboBox"
HorizontalAlignment="Left"
Margin="130,83,0,0"
VerticalAlignment="Top"
Width="120"
ItemsSource="{Binding collection}"
DisplayMemberPath="firstName"
SelectedItem="{Binding SelectedPerson}"
SelectionChanged="comboBox_SelectionChanged"/>
<Button x:Name="btnCheck" Content="Button" HorizontalAlignment="Left" Margin="156,129,0,0" VerticalAlignment="Top" Width="75" Click="btnCheck_Click"/>
C#代码
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection<Person> collection = new ObservableCollection<Person>();
public ObservableCollection<Person> Collection
{
get { return collection; }
set { collection = value; OnPropertyChanged(); }
}
private Person selectedPerson = new Person();
public Person SelectedPerson
{
get { return selectedPerson; }
set { selectedPerson = value; OnPropertyChanged(); }
}
public MainWindow()
{
InitializeComponent();
collection = new ObservableCollection<Person>() { { new Person("Murray", "Hart")}, { new Person("John", "Clifford") } };
comboBox.ItemsSource = collection;
}
private void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
SelectedPerson = (Person)comboBox.SelectedItem;
}
protected void OnPropertyChanged([CallerMemberName] string name = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
private void btnCheck_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(SelectedPerson.lastName);
}
}
public class Person
{
public string firstName { get; set; }
public string lastName { get; set; }
public Person()
{
}
public Person(string fname, string lname)
{
firstName = fname;
lastName = lname;
}
}