WPF - Возможно ли преобразование в несколько свойств? - PullRequest
0 голосов
/ 18 января 2010

У меня есть текстовое поле и флажок, я хотел бы установить три свойства для текстового поля в зависимости от того, установлен флажок или нет.

Я могу связать свойства с флажком, но тогда мне нужно знать, какое свойство связывается в конвертере.

Например, если флажок снят, я бы хотел, чтобы свойства текстового поля были AcceptsReturn="False" TextWrapping="NoWrap" Height="25".

Затем проверил: AcceptsReturn="True" TextWrapping="Wrap" Height="100".

Требуется ли для этого 3 конвертера или я могу сообщить конвертеру "если отмечено == true && boundfrom == height, return 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>

Ответы [ 3 ]

3 голосов
/ 18 января 2010

Это должно работать с одним конвертером, используя свойство 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
    }
}
2 голосов
/ 18 января 2010

Я бы серьезно подумал об использовании триггера данных. Это проблема пользовательского интерфейса, поэтому я постараюсь не использовать вашу модель представления. Вы можете сделать это с помощью нескольких строк xaml.

1 голос
/ 18 января 2010
<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=height и CommandParameter=textwrapping и посмотреть на параметр в конвертере, но я не фанат такого подхода. Третий вариант - создать свойства IsChecked, TextWrapping и Height в вашей модели представления, привязать их и поместить логику преобразования в свойствах.

...