是否可以通过xaml中的绑定来打开和关闭转换?

时间:2013-05-02 09:26:44

标签: xaml binding

我想通过复选框激活转换。

在我的示例中,我有两个复选框,它们应分别在x或y方向交换标签中的文本。

这可能没有代码吗?

到目前为止,这是我的xaml:

<Window x:Class="WpfVideoTest.InversionTestWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="InversionTestWindow" Height="300" Width="300">
<DockPanel>
    <CheckBox DockPanel.Dock="Bottom" IsChecked="{Binding InvertX}">Invert X</CheckBox>
    <CheckBox DockPanel.Dock="Bottom" IsChecked="{Binding InvertY}">Invert Y</CheckBox>
    <Label Content="Text to invert" FontSize="40" x:Name="TextToInvert">
        <Label.RenderTransform>
            <TransformGroup>
                <!-- transformations to swap in x direction -->
                <ScaleTransform ScaleX="-1"  />
                <TranslateTransform X="{Binding ActualWidth, ElementName=TextToInvert}" />
                <!-- transformations to swap in y direction -->
                <ScaleTransform ScaleY="-1" />
                <TranslateTransform Y="{Binding ActualHeight, ElementName=TextToInvert}" />
            </TransformGroup>
        </Label.RenderTransform>
    </Label>
</DockPanel>

1 个答案:

答案 0 :(得分:1)

您需要使用ConverterMultiConverter。是的,它是代码,但它是有序的方式代码被添加到WPF中的绑定。从概念上讲,您希望应用于转换的值依赖于某个其他值,并且转换类本身不具有该功能。

这就是转换器的样子。它期望三个值,其中第一个是bool。

public class TernaryConditionalMultiConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values.Length >= 3 && values[0] is bool)
        {
            return (bool)values[0] ? values[1] : values[2];
        }
        return null;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

你会这样使用它:

<ScaleTransform>
    <ScaleTransform.ScaleX>
        <MultiBinding Converter="{StaticResource TernaryConditionalConverter}">
            <Binding Path="InvertX" />
            <Binding Source="{StaticResource PositiveOne}" />
            <Binding Source="{StaticResource NegativeOne}" />
        </MultiBinding>
    </ScaleTransform.ScaleX>
</ScaleTransform>

其中PositiveOne和NegativeOne已在某处定义为资源,例如:

<sys:Double x:Key="PositiveOne">1</sys:Double>