ReadOnlyCheckBox ControlTemplate
-
12-09-2019 - |
题
我一直在尝试创建通用的ReadOnlyCheckBox样式/模板,但是我对数据的绑定有问题。在此处的示例中:
您可以直接绑定到ControlTemplate定义中的数据,但这当然不是我想要的,因为我希望能够声明这样的新复选框:
<CheckBox x:Name="uiComboBox" Content="Does not set the backing property, but responds to it."
Style="{StaticResource ReadOnlyCheckBoxStyle}" IsChecked="{Binding MyBoolean}" Click="uiComboBox_Click"/>
当然,除了我这样做,然后将事件触发器设置为``''''''''''模板插头。我想我不明白为什么要在子弹中直接设置绑定与设置的设置不同,然后与之绑定,不是只是引用一种引用所创建的控件属性中设置的内容的方式吗?即使数据没有更新,点击触发UI更新的点击端如何?是否有点击触发器我可以覆盖以停止更新?
我让所有的词典资源都可以正常工作,所以我对指针感到满意。
我对此感到好奇的另一件事是,是否可以使用样式中的基于基础参数来减少控制/样式模板,那么我只会覆盖我实际需要更改的内容,而不是宣布很多我认为的东西无论如何都是标准模板的一部分。我可能会玩这个。
干杯
ed
解决方案
您遇到的问题是您正在尝试使用数据指标。
我不同意您在发布的链接中获得的其他答案。当ControlTemplate解决方案显得整洁且整洁,但它们并没有达到您的问题的核心,也就是说,您正在尝试使用单个控件(复选框)来执行两种不同的操作:显示状态(例如,检查/未选中, )并执行逻辑(远程设备等)。
ControlTemplate旨在改变控制的方式 出现, , 但不是 行为. 。您正在尝试改变行为,而不是外观。请参阅“什么是ControlTemplate?” 这里 更多细节
为此,您将不得不存储一些放弃标准绑定并处理一些事件:
XAML:
<Window x:Class="WPFCheckBoxClickTester.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<CheckBox x:Name="foo" Checked="foo_Checked"></CheckBox>
</Grid>
</Window>
代码范围:
using System.ComponentModel;
using System.Threading;
using System.Windows;
namespace WPFCheckBoxClickTester
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
private BackgroundWorker _worker = new BackgroundWorker();
public Window1()
{
InitializeComponent();
foo.IsThreeState = false;
this._worker.DoWork += new DoWorkEventHandler(_worker_DoWork);
this._worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_worker_RunWorkerCompleted);
}
private void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
foo.IsChecked = true;
foo.IsEnabled = true;
return;
}
private void _worker_DoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(500);
return;
}
private void foo_Checked(object sender, RoutedEventArgs e)
{
if( foo.IsChecked == true && this.foo.IsEnabled )
{
this.foo.IsChecked = false;
this.foo.IsEnabled = false;
this._worker.RunWorkerAsync();
}
return;
}
}
}
上面的代码示例使您能够通过背景工作者执行某些代码异步 - 我将thread.sleep作为占位符。我还使用foo.isenabled作为foo_checked中的哨兵值,但是您可能需要一些额外的状态来处理所有情况(例如,从检查到未检查)。