Как привязать свойство TextWrapping TextBox к значению IsChecked MenuItem?
Вопрос
Свойство TextWrapping TextBox имеет три возможных значения:
- Сворачивать
- NoWrap
- WrapWithOverflow
Я хотел бы привязаться к свойству IsChecked MenuItem.Если MenuItem отмечен флажком, я хочу установить для свойства TextWrapping TextBox значение Wrap.Если MenuItem не отмечен флажком, я хочу установить для свойства TextWrapping TextBox значение NoWrap.
Подводя итог, я пытаюсь привязать элемент управления, имеющий два состояния, к двум значениям перечисления, имеющего более двух значений.
[редактировать] Я хотел бы сделать это в XAML, если это возможно.
[редактировать] Я понял, как это сделать, используя IValueConverter.Возможно, есть лучший способ сделать это?Вот что я сделал:
В Window.Resources я объявил ссылку на свой ValueConverter.
<local:Boolean2TextWrapping x:Key="Boolean2TextWrapping" />
В моем TextBox я создал привязку к MenuItem и включил Converter в оператор привязки.
TextWrapping="{Binding ElementName=MenuItemWordWrap, Path=IsChecked, Converter={StaticResource Boolean2TextWrapping}}"
и ValueConverter выглядит так:
public class Boolean2TextWrapping : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo cultureInfo)
{
if (((bool)value) == false)
{
return TextWrapping.NoWrap;
}
return TextWrapping.Wrap;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Решение
Если вы хотите сделать все это в xaml, вам нужно использовать Стиль и DataTrigger.
<StackPanel>
<CheckBox x:Name="WordWrap">Word Wrap</CheckBox>
<TextBlock Width="50">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin lacinia nibh non augue. Pellentesque pretium neque et neque auctor adipiscing.
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, ElementName=WordWrap}" Value="True">
<Setter Property="TextWrapping" Value="Wrap" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
Другие советы
я думаю что единственный и правильный типичный способ сделать это — использовать преобразователь значений, как вы уже это сделали.
Иногда вы можете найти существующий преобразователь значений, который вы уже создали…или даже лучше, что Microsoft создала для вас.Например, в System.Windows.Controls Microsoft написала BooleanToVisibilityConverter...который преобразует логическое значение в перечисление видимости...преобразование True в Visible и False в Collapsed (и не беспокоясь о скрытом).
Одна из идей состоит в том, чтобы использовать .NET Reflector, перейти к System.Windows.Data.IValueConverter, а затем использовать функцию анализа (в частности, «Используется») и посмотреть, какие вещи реализовали IValueConverter...и, возможно, вам повезет найти преобразователь, соответствующий вашим целям.
Кстати, BooleanToVisibilityConverter очень похож на то, что вы пытаетесь сделать выше.
Редактировать:Мне очень нравится предложение Тодда Уайта стилизовать TextBox и использовать DataTrigger в стиле.Это очень хорошая идея, если вы хотите избежать конвертера.
Я предполагаю, что вы говорите о .NET.Я не думаю, что привязка данных здесь будет работать, потому что значения не одного типа (логическое или перечисление).Самым простым решением было бы обработать событие CheckedChanged этого пункта меню и соответствующим образом настроить режим переноса текстового поля.