Использование DataTemplate для прикрепления OnClick для изменения bool - PullRequest
1 голос
/ 17 ноября 2009

Я хочу создать табличку с данными (в коде, но это не главное), которая позволяет мне нажимать на элемент и устанавливать его значение bool. Мне удалось создать комбинацию CheckBox и TextBlock, цвет которой зависит от значения bool.

Пока все хорошо ... Но как я могу сказать WPF: Если кто-то нажмет на TextBlock, измените значение bool. (убрав необходимость в уродливом флажке)

Код пока и работает:

var dT = new DataTemplate(typeof(DirectoryWrapper));
var stackPanel = new FrameworkElementFactory(typeof(StackPanel));

var style = new Style(typeof(TextBlock));
var t = new DataTrigger() {Binding = new Binding(DirectoryWrapper.PropString(x => x.IsSelected)), Value = true};
t.Setters.Add(new Setter() { Property = TextBox.ForegroundProperty, Value = new SolidColorBrush(Colors.Green) });
style.Triggers.Add(t);


var box = new FrameworkElementFactory(typeof(CheckBox));
box.SetBinding(CheckBox.IsCheckedProperty, new Binding(DirectoryWrapper.PropString(x => x.IsSelected)));
stackPanel.AppendChild(box);

var entry = new FrameworkElementFactory(typeof(TextBlock));
entry.SetBinding(TextBlock.TextProperty, new Binding(DirectoryWrapper.PropString(x => x.Path)));
entry.SetValue(TextBox.StyleProperty, style);
stackPanel.AppendChild(entry);

dT.VisualTree = stackPanel;
return dT;

Ответы [ 3 ]

2 голосов
/ 17 ноября 2009

В WPF это тривиально: просто создайте шаблон вашего CheckBox, чтобы он выглядел как TextBlock:

<CheckBox>
  <CheckBox.Template>
    <ControlTemplate>
      <TextBlock Binding="{Binding WhateverYouWant}" ... />
    </ControlTemplate>
  </CheckBox.Template>
</CheckBox>

Это может быть расширено путем добавления Border вокруг TextBlock или чего-либо еще, что вам нравится, чтобы придать ему больше пиццы.

Причина, по которой вы хотите использовать CheckBox вместо ToggleButton, заключается в том, что CheckBox имеет дополнительную поддержку клавиатуры, а также поддержку accessibilty для сопоставления с парадигмой checkbox на доступном устройстве. ToggleButton не предоставляет вам этих возможностей.

0 голосов
/ 17 ноября 2009

Хорошо, просто для удобства, рабочий код для Ray Burns Solution:

(Для начинающих: функция PropString - это просто оболочка для удаления магических строк, используйте строку имени свойства, с которой вы связываетесь ...)

var dT = new DataTemplate(typeof (DirectoryWrapper));

// Create style to set text red if checked
var style = new Style(typeof (TextBlock));
var t = new DataTrigger() {Binding = new Binding(PropString(x => x.IsSelected)), Value = true};
t.Setters.Add(new Setter() {Property = Control.ForegroundProperty, Value = new SolidColorBrush(Colors.Red)});
style.Triggers.Add(t);

// Create text box
var entry = new FrameworkElementFactory(typeof(TextBlock));
entry.SetBinding(TextBlock.TextProperty, new Binding(PropString(x => x.Path)));
entry.SetValue(FrameworkElement.StyleProperty, style);

// Put into template
var boxTemplate= new ControlTemplate(typeof(CheckBox)) {VisualTree = entry};

// Create box and set template
var box = new FrameworkElementFactory(typeof (CheckBox));
box.SetBinding(ToggleButton.IsCheckedProperty, new Binding(PropString(x => x.IsSelected)));
box.SetValue(Control.TemplateProperty, boxTemplate);

dT.VisualTree = box;
return dT;
0 голосов
/ 17 ноября 2009

Не могу использовать кнопку Toggle и создать любой стиль / шаблон управления, который вам нужен, чтобы получить желаемый вид. ToggleButton установит для свойства IsChecked значение true или false в зависимости от вашего щелчка. Так что свяжите свое свойство Data с ToggleButton.IsSelected

...