0

我有一个文本框和一个复选框,我想根据复选框是否被选中在文本框上设置三个属性。

我可以将属性绑定到复选框,但是我需要知道转换器中绑定了哪些属性。

例如,当未选中时,我希望文本框属性为AcceptsReturn="False" TextWrapping="NoWrap" Height="25".

然后检查:AcceptsReturn="True" TextWrapping="Wrap" Height="100".

这需要 3 个转换器还是我可以告诉转换器“如果检查 ==true && boundfrom == height,返回 100”

谢谢,科汉


接受的解决方案

<TextBox Name="txtAnswer" Margin="5" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Hidden" >
                <TextBox.Style>
                    <Style>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ElementName=cbMultiLine, Path=IsChecked}" Value="True">
                                <Setter Property="TextBox.TextWrapping" Value="Wrap" />
                                <Setter Property="TextBox.Height" Value="100" />
                                <Setter Property="TextBox.AcceptsReturn" Value="True" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBox.Style>
            </TextBox>
4

3 回答 3

3

这应该适用于一个转换器,方法是使用绑定上的 ConverterParameter 属性:

Converter="{StaticResource MyIsCheckedConverter}" ConverterParameter="height"

转换器看起来像:

public class IsCheckedConverter : IValueConverter
{
    public object Convert(
     object value, Type targetType,
     object parameter, System.Globalization.CultureInfo culture)
    {
        object returnValue;

        if (!((bool?)value).HasValue)
            //do something if null (but I don't see why it would be)

        switch ((string) parameter)
        {
            case "height":
                  returnValue = ((bool?)value).Value ? 100 : 25; 
                  break;
            case "TextWrapping":
                   .....
                  ..... 
        }

        return returnValue;
    }

    public object ConvertBack(
     object value, Type targetType,
     object parameter, System.Globalization.CultureInfo culture)
    {
        //Likewise for convert back but I think in your case you wouldn't need to convert back
    }
}
于 2010-01-18T01:14:31.713 回答
2

我会认真考虑使用数据触发器。这是一个用户界面问题,所以我会尽量避免使用您的视图模型。您只需几行 xaml 就可以做到这一点。

于 2010-01-18T08:58:38.983 回答
1
<CheckBox x:Name="myCheckBox" />
<TextBox 
    AcceptsReturn="{Binding ElementName=myCheckBox, Path=IsChecked}"
    TextWrapping="{Binding ElementName=myCheckBox, Path=IsChecked, Converter={StaticResource boolToTextWrappingConverter}}" 
    Height="{Binding ElementName=myCheckBox, Path=IsChecked, Converter={StaticResource boolToHeightConverter}}" 
/>

这会将其减少到 2 个转换器。您也可以boolToTextWrappingOrHeight按照您在帖子中的建议编写一个转换器,然后传入一个CommandParameter=heightandCommandParameter=textwrapping并查看转换器中的参数,但我不喜欢这种方法。第三种选择是在视图模型中创建IsChecked,TextWrappingHeight属性,绑定到这些属性,然后将转换逻辑放入属性中。

于 2010-01-18T01:10:47.903 回答