我想创建一个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;
答案 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;