不能将选择绑定到WPF组合框

本文关键字:WPF 组合 绑定 选择 不能 | 更新日期: 2023-09-27 18:03:57

我想有两个选项"M"answers"F"的组合框,并设置从我的代码与值之一的字符串的选择。这似乎太基本了,甚至连问都不好意思。然而,我还没有看到一个例子不包含50行带有自定义类的代码,等等。为了使事情更简单,我想在XAML中预先填充这两个选项。为什么这个简单的任务让我觉得自己像个智力侏儒?这是我的文件:

<ComboBox x:Name="cboGender"  >
    <ComboBoxItem Tag="M" Content="M"></ComboBoxItem>
    <ComboBoxItem Tag="F" Content="F"></ComboBoxItem>
</ComboBox>

背后的代码:

cboGender.SelectedValue = "M";

请帮帮我,免得我砸了我的电脑,回到ASP。

不能将选择绑定到WPF组合框

尝试如下:

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>

(在这种情况下SelectedItemSelectedValue都起作用)

在砸你的系统之前试试这个- cboGender.SelectedIndex = 0;。:)

首先,如果你曾经在代码中操作过WPF UI元素,那你就做错了。当然,你可以创建一个带有"M"answers"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; }
}

那么您的XAML—假设您已经将DataContext设置为MyViewModel的一个实例—变成:

<ComboBox ItemsSource="{Binding Genders}" SelectedValue="{Binding Gender}"/>

使用Gender属性的任何其他逻辑现在都要查看这个类,而不是UI。所以你可以改变UI而不影响你的逻辑,反之亦然。

(请注意,虽然视图模型通常实现INotifyPropertyChanged,但如果您打算在代码中更改Gender并希望新值反映在UI中,则只需需要来执行此操作)