如何将带有转换器的组合框绑定到 WPF 中的列表

本文关键字:绑定 WPF 列表 组合 转换器 | 更新日期: 2023-09-27 18:32:50

在这里,我试图将组合框绑定到列表代码。组合框显示:A & B

<ComboBox ItemsSource="{Binding Path=Codes}"/>
public SettingsWindow()
{
    InitializeComponent();
    Codes = new List<Code> {Code.A, Code.B};
    DataContext = this;
}

我已经定义了一个转换器来在组合框中显示更易于理解的信息:

public class CodeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var code = (Code)value;
        string text;
        if (code == Code.A)
        {
            text = "ACI318-99";
        }
        else
        {
           text = "ACI318-11";
        }
        return text;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
} 

但是我不知道如何在我的XAML中使用此转换器,因此我的组合框中将ACI318-99和ACI318-11。

如何将带有转换器的组合框绑定到 WPF 中的列表

您应该设置组合框的 ItemTemplate,并在其中使用转换器。

<ComboBox ItemsSource="{Binding Codes}">
   <ComboBox.ItemTemplate>
     <DataTemplate>
      <TextBlock Text="{Binding Path=., Converter={StaticResource converterInstance}}"/>
     </DataTemplate>
  </ComboBox.ItemTemplate>          
</ComboBox>

在这里,转换器实例应该是资源字典中自定义转换器的实例。

Caliburn Micro 约定并没有太大的不同,但我只是想为未来的搜索者添加它。(在我的情况下不需要路径=.)

<ComboBox x:Name="MyPropertyWithItems">
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Converter={StaticResource converterInstance}}"/>
    </DataTemplate>
  </ComboBox.ItemTemplate>          
</ComboBox>

试试

<Window.Resources>
    <CodeConverter x:Key="CodeConverter"/>
</Window.Resources>

<ComboBox ItemsSource="{Binding Path="Codes" Converter="{StaticResource CodeConverter}}"/>