[英]Can't bind selection to WPF Combobox
我想要一个带有两个选项“ M”和“ F”的ComboBox,并用一个值之一的字符串设置我的代码中的选择。 这似乎很基础,甚至问也很尴尬。 但是,我还没有看到一个不包含50行代码以及自定义类等的示例。为了使事情变得更加简单,我想在XAML中预填充这两个选项。 为什么这个简单的任务使我感觉像个精神上的侏儒? 这就是我所拥有的:
<ComboBox x:Name="cboGender" >
<ComboBoxItem Tag="M" Content="M"></ComboBoxItem>
<ComboBoxItem Tag="F" Content="F"></ComboBoxItem>
</ComboBox>
代码背后:
cboGender.SelectedValue = "M";
在捣毁计算机并永久返回ASP.NET开发之前,请提供帮助。
请尝试以下操作:
cboGender.ItemsSource = new string [] { "M", "F" };
cboGender.SelectedItem = "M";
您需要将ItemsSource设置为项目集合。 然后,ComboBox将为您生成ComboBoxItems。
添加SelectedValuePath
,它可以工作:
<ComboBox x:Name="cboGender" SelectedValuePath="Content" >
<ComboBoxItem Tag="M" Content="M"></ComboBoxItem>
<ComboBoxItem Tag="F" Content="F"></ComboBoxItem>
</ComboBox>
( SelectedValuePath="Tag"
也会起作用,尽管在两种情况下在两个地方使用相同的数据似乎都是多余的 )
作为旁注,类似于Colin的答案,您可以设置以下项:
xmlns:sys="clr-namespace:System;assembly=mscorlib"
<ComboBox x:Name="cboGender">
<sys:String>M</sys:String>
<sys:String>F</sys:String>
</ComboBox>
( 在这种情况下, SelectedItem
和SelectedValue
工作 )
试试这个cboGender.SelectedIndex = 0;
在粉碎系统之前.. :)
大致来说,如果您曾经在代码中操纵WPF UI元素,那就错了。 当然,您可以创建一个带有“ M”和“ F”的组合框并预设其选择:
<ComboBox>
<ComboBoxItem>M</ComboBoxItem>
<ComboBoxItem>F</ComboBoxItem>
<ComboBox.SelectedIndex>0</ComboBox.SelectedIndex>
</ComboBox>
但是那又怎样呢? 您如何处理该选择? 如果您的答案涉及以下内容:
if cboGender.SelectedValue == "M"
您要走的路会导致您编写很难维护的程序。
另一方面,如果您创建一个类来将UI绑定到该类,如下所示:
public class MyViewModel
{
public MyViewModelClass()
{
Gender = "M";
}
public IEnumerable<string> Genders { get { return new string[] { "M", "F" } };
public string Gender { get; set; }
}
然后,您的MyViewModel
假设您已将DataContext
设置为MyViewModel
的实例, MyViewModel
变为:
<ComboBox ItemsSource="{Binding Genders}" SelectedValue="{Binding Gender}"/>
现在,使用Gender
属性的任何其他逻辑都将查看此类,而不是UI。 因此,您可以在不影响逻辑的情况下更改UI,反之亦然。
(请注意,尽管视图模型通常实现INotifyPropertyChanged
,但仅当您要在代码中更改Gender
并希望新值反映在UI中时,才需要这样做。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.