WPF使用转换器绑定组合框

时间:2013-04-04 19:02:12

标签: wpf binding combobox converter

我有ComboBox绑定到EnumerableRowCollection<T>

ComboFamilyStatus.ItemsSource = EnumerableRowCollection<TaxDataSet.SourcesOfValuesRow> coll;

我的xaml看起来像这样:

<ComboBox Name="ComboFamilyStatus" DisplayMemberPath="Description" 
          Text="{Binding FamilyStatus, Converter={StaticResource FamilyStatusStringConverter}}">

我正在使用DisplayMemberPath来显示该行的说明。 SourcesOfValuesRow有一个值和一个描述,在组合中我想看到描述文本。 Text被绑定到将FamilyStatus保存为int值的数据库,这就是我添加转换器的原因。

我的问题是转换器是否可以使用组合框中的itemsource从int值转换为字符串?我没有看到转换器知道有关组合的任何信息。与此同时,我编写了转换器,再次从数据库中取出EnumerableRowCollection<TaxDataSet.SourcesOfValuesRow>并找到匹配的描述 - 这不是最简单的方法! 有什么建议??

2 个答案:

答案 0 :(得分:3)

在这种情况下,您最好使用DataTemplate,而不是Converter

您已有数据类。只需使用DataTemplate插入绑定到int值的Textblock,然后在那里应用转换器。

<ComboBox>
   <ComboBox.ItemTemplate>
      <DataTemplate DataType="{x:Type local:TaxDataSet.SourcesOfValuesRow}">
         <TextBlock Text="{Binding FamilyStatus, Converter={StaticResource FamilyStatusStringConverter}}"/>
      </DataTemplate>
   </ComboBox.ItemTemplate>
<ComboBox>

将SourcesOfValuesRow FamilyStatusProperty更改为枚举。从int派生可以让你直接投射它。

enum FamilyStatusValues : int
{
   [Description("Married")]
   Married,
   [Description("Divorced")]
   Divorced,
   [Description("Living Together")]
   LivingTogether
}

然后在您的转换器中使用此代码

ConvertTo(object value, ...)
{
   FieldInfo field = value.GetType().GetField(value.ToString());
   object[] attribs = field.GetCustomAttributes(typeof(DescriptionAttribute), true));
   if(attribs.Length > 0)
   {
       return ((DescriptionAttribute)attribs[0]).Description;
   }
   return string.Empty;
}

答案 1 :(得分:0)

无需使用任何转换器。它对我有用:

<ComboBox Name="FamilyStatus" Grid.Row="7" Grid.Column="1" ItemsSource="{Binding Source={StaticResource comboProvider}}"
            SelectedValuePath="Value" DisplayMemberPath="Description" SelectedValue="{Binding FamilyStatus}">

其中DisplayMemberPathTaxDataSet.SourcesOfValuesRow的字符串,SelectedValuePath是int值。 SelectedValue是联系人表格中的值(而不是在组合Text="{Binding FamilyStatus, Converter={StaticResource FamilyStatusStringConverter}}中撰写)。