如何将二进制属性绑定到具有多个值的属性?

时间:2016-01-31 09:52:37

标签: c# wpf xaml

我有一个ToggleButton是一个标准的WPF类,我想将IsChecked绑定到我的模型的属性状态,Status可以有两个以上的值:Status1,Status2,Status3,Status4。 Status的类型为SomeThirdPartyClassStatus,我无法访问其源代码。

<ToggleButton IsChecked="{Binding Status???}" />

那么如何将状态绑定到IsChecked呢?我更喜欢xaml解决方案。

我希望绑定IsChecked属性,以便当Status等于Status1时它为True,而在其他情况下它为false。我不想在* .cs文件中编写任何代码,而只编写xaml代码。

3 个答案:

答案 0 :(得分:1)

创建一个派生自IValueConverter的类,您可以将其应用于绑定。

https://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter(v=vs.110).aspx

答案 1 :(得分:1)

<强>更新

只需使用此样式切换按钮

即可
<Style TargetType="{x:Type ToggleButton}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Status}" Value="Status1" >
            <Setter Property="IsChecked" Value="True" />
         </DataTrigger>
   </Style.Triggers>        
</Style>

因此,如果Status有值,将检查Status1切换按钮。

答案 2 :(得分:1)

作为替代方案,您可以将纯XAML解决方案与DataTrigger一起使用。假设你有像

这样的东西
public enum SomeThirdPartyClassStatus {
    Status1, 
    Status2, 
    Status3, 
    Status4
}

你可以做到

<ToggleButton>
    <ToggleButton.Style>
        <Style TargetType="{x:Type ToggleButton}">
            <Setter Property="IsChecked" Value="False"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Status}" Value="{x:Static local:SomeThirdPartyClassStatus.Status1}">
                    <Setter Property="IsChecked" Value="True"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ToggleButton.Style>
</ToggleButton>

其中localSomeThirdPartyClassStatus的名称空间,如

xmlns:local="clr-namespace:WpfApplication1"

警告说它只能单向

修改

对于双向绑定,您需要自定义IValueConverter

public class EnumConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (SomeThirdPartyClassStatus)value == SomeThirdPartyClassStatus.Status1;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (bool?)value == true ? SomeThirdPartyClassStatus.Status1 : SomeThirdPartyClassStatus.Status2;
    }
}

然后绑定看起来像

<ToggleButton IsChecked="{Binding Path=Status, Converter={StaticResource EnumConverter}}"/>