WPF 是否转换器

本文关键字:转换器 是否 WPF | 更新日期: 2023-09-27 18:31:02

我的表中有一个位字段,我需要将其转换为与 1 或 0 相关的是或否。到目前为止,我使用的是这样的转换器,但它不太有效。

由于我绑定到组合框,我需要在代码中填充它,但是没有字段可以设置显示成员路径和选定值路径。

另外,我的调试器.break()也不起作用。

感谢您的任何帮助

public class BooleanToYesNoConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
     Debugger.Break();
     if (value == null)
        return "No";
     bool inValue = (bool)value;
     string outValue = inValue ? "Yes" : "No";
     return outValue;
  }
  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
     Debugger.Break();
     if (value == null)
        return 0;
     int? outValue;
     string inValue = (string)value;
     inValue = inValue.Trim();
     if (inValue == "Yes")
     {
        outValue = 1;
     }
     else
        if (inValue == "No")
        {
           outValue = 0;
        }
        else
        {
           return DependencyProperty.UnsetValue;
        }
     return outValue;
  }

}

这是我在视图模型中的属性,它绑定到

private BindableCollection<string> _licensedBitDisplay;
public BindableCollection<string> LicensedBitDisplay
{
   get { return _licensedBitDisplay; }
   set { SetValueAndNotify(() => LicensedBitDisplay, ref _licensedBitDisplay, value); }
}

和填充下拉列表的代码

LicensedBitDisplay = new BindableCollection<string>();
LicensedBitDisplay.AddRange(new List<string>() { "No", "Yes" });

最后是 xaml

<ComboBox Margin="24,3,0,3" Width="162" HorizontalAlignment="left" telerik:StyleManager.Theme="Office_Blue" 
    ItemsSource="{Binding Path=LicensedBitDisplay}" 
    SelectedValue="{Binding Path=CurrentEntity.Licensed, Mode=TwoWay, 
    Converter={StaticResource BooleanToYesNoConverter1},
    diag:PresentationTraceSources.TraceLevel=High}" />

WPF 是否转换器

您的转换是向后的,因为绑定源 ( LicensedBitDisplay ) 包含字符串。

转换从源转换为目标。源是视图模型,目标是绑定到它的 UI 控件)。转换回从目标转换为源。这通常仅在控件接受用户输入时有用(例如,用户在文本框中键入"是",转换器1 ViewModel 属性)。

要完成这项工作,LicensedBitDisplay应该是 int? 的集合。此外,您当前的Convert实现将失败,因为无法将int?强制转换为bool。相反,您可以使用System.Convert.ToBoolean(它也会自动将null转换为false)。转换器应仅用于在 ComboBox 的 ItemTemplate 中显示:

<ComboBox ItemsSource="{Binding Path=LicensedBitDisplay}" 
          SelectedValue="{Binding Path=CurrentEntity.Licensed}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Converter={StaticResource BooleanToYesNoConverter1}}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

就个人而言,我根本不喜欢使用转换器,尤其是在选择内容时。表达这一点的另一种方法是通过触发器:

<ComboBox ItemsSource="{Binding Path=LicensedBitDisplay}" 
          SelectedValue="{Binding Path=CurrentEntity.Licensed}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Name="TextBlock" Text="No" />
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding}" Value="1">
                    <Setter TargetName="TextBlock" Property="Text" Value="Yes" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>