Silverlight实现值转换器到comboBox

时间:2012-12-20 13:46:20

标签: silverlight xaml combobox valueconverter

我有以下情况

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-在模型类中,我定义了一个属性并绑定到组合框中的selectedvalue

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

我知道我必须实现转换器,但不知道具体如何。我想要的是当模型中的选择是/否,获得真/假值,当&#34;全部&#34;被选中,以获得空值。

1 个答案:

答案 0 :(得分:1)

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

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"