使用DataTemplate将OnClick附加到bool更改

时间:2009-11-16 23:36:54

标签: wpf datatemplate onclick

我想创建一个datatemplate(在代码中,但这不是重点),它允许我点击一个项目并设置其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 个答案:

答案 0 :(得分:2)

这在WPF中是微不足道的:只需将CheckBox模板化为TextBlock:

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

可以通过在Border附近添加TextBlock或您喜欢的其他任何内容来扩展这一点。

您希望使用CheckBox而不是ToggleButton的原因是CheckBox具有额外的键盘支持,以及可访问支持以映射到accessibilty设备上的复选框范例。 ToggleButton并未向您提供这些功能。

答案 1 :(得分:0)

您不能使用切换按钮创建所需的样式/控制模板以获得所需的外观。 ToggleButton会根据您的点击将其IsChecked属性设置为true或false。因此,将您的Data属性绑定到ToggleButton.IsSelected

答案 2 :(得分:0)

确定, 为了方便,Ray Burns解决方案的工作代码:

(对于初学者: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;