【问题标题】:WPF YesNo ConverterWPF YesNo 转换器
【发布时间】:2013-09-11 19:57:57
【问题描述】:

我的表中有一个位字段,我需要将其转换为与 1 或 0 相关的 Yes 或 No。 到目前为止,我正在使用这样的转换器,但它并不能很好地工作。

由于我绑定到一个组合框,我需要在代码中填充它,但是没有一个字段可以将 DisplayMemberPath 和 SelectedValuePath 设置为。

另外,我的 debugger.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;
  }

}

这是我在 ViewModel 中绑定到的属性

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}" />

【问题讨论】:

  • 那么..有什么问题?
  • 你为什么返回一个对象而不是一个字符串?此外,您似乎没有使用ConvertConvertBack 中的其他参数,为什么要传递它们?
  • 避免更多麻烦并为 ComboBox 使用 ItemTemplate
  • @Jonesy:因为IValueConverter 是这样定义的
  • @Jonesy 您的问题无效,与 OP 试图做什么无关。他不使用 Convert 和 ConvertBack 中的其他参数也没关系。

标签: c# wpf


【解决方案1】:

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

Convert 将源转换为目标。 Source 是 ViewModel,target 是绑定到它的 UI 控件)。 ConvertBack 从目标转换为源。这通常仅在您有一个接受用户输入的控件时有用(例如,用户在文本框中键入“是”并且转换器将 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>

【讨论】:

  • 感谢您的回复。如果我将 LicensedBitDisplay 设为可为空的 int 类型,则必须用整数填充它。但是我需要下拉菜单来显示是/否?所以我需要对 Itemsource 进行转换调用?当我这样做时,下拉列表会被清除并且不会填充。我确实对转换器进行了铸造更改
  • 我在加载时调试了实体,许可字段为“true”。
  • @RobDog888 实际上,转换器需要在 ItemTemplate 中。我更新了答案。
  • 我尝试了更新后的代码,但无法让任一版本正常工作。我尝试了转换器示例和您的内联示例。我使用 inline 收到此错误,并且实体没有得到脏标志 - “无法使用默认转换将 '0' 从类型 'Int32' 转换为类型 'System.Boolean' 用于 'en-US' 文化;考虑使用 Binding 的 Converter 属性...”
  • @RobDog888 如果 Licensed 属性是布尔值,您可以只使用“True”而不是“1”。
猜你喜欢
  • 2010-11-24
  • 2011-09-23
  • 1970-01-01
  • 2013-01-12
  • 2013-06-21
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多