0

我有以下情况

1- xaml 中的组合框

<ComboBox 
x:Name="PublishableCbo" Width="150" IsEnabled="True" HorizontalAlignment="Left" Height="20" 
SelectedValue="{Binding Path=Published, Mode=TwoWay}"
Grid.Column="6" Grid.Row="0">
<ComboBox.Items>
    <ComboBoxItem Content="All"  IsSelected="True" />
    <ComboBoxItem Content="Yes"  />
    <ComboBoxItem Content="No"  />
</ComboBox.Items>

2- 在模型类中,我定义了一个属性并绑定到组合框中的选定值

 public bool Published
    {
      get
      {
        return _published;
      }
      set
      {
        _published = value;
        OnPropertyChanged("Published");
      }
    }

我知道我必须实现一个转换器,但不知道具体如何。What I want is when a select Yes/No, in the model get a True/false value, when "all" is selected, to get null value.

4

1 回答 1

1

为了能够分配nullPublished属性,您必须将其类型更改为Nullable<bool>(您可以用bool?C# 编写)。

public bool? Published
{
    ...
}

可以实现转换器,以便它从string到转换,bool反之亦然,可能如下所示。请注意,转换器使用bool,而不是bool?因为该值是作为 传入和传出转换器的object,因此无论如何都要装箱。

public class YesNoAllConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        object result = "All";

        if (value is bool)
        {
            result = (bool)value ? "Yes" : "No";
        }

        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        object result = null;

        switch ((string)value)
        {
            case "Yes":
                result = true;
                break;
            case "No":
                result = false;
                break;
        }

        return result;
    }
}

要启用此转换器,您必须将 ComboBox 项目类型更改为string,并绑定到SelectedItem属性,而不是 SelectedValue。

<ComboBox SelectedItem="{Binding Path=Published, Mode=TwoWay,
                         Converter={StaticResource YesNoAllConverter}}">
    <sys:String>All</sys:String>
    <sys:String>Yes</sys:String>
    <sys:String>No</sys:String>
</ComboBox>

sys以下 xml 命名空间声明在哪里:

xmlns:sys="clr-namespace:System;assembly=mscorlib"
于 2012-12-20T14:41:06.543 回答