我一直在尝试创建通用的ReadOnlyCheckBox样式/模板,但是我对数据的绑定有问题。在此处的示例中:

C#WPF中的仅阅读复选框

您可以直接绑定到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中的哨兵值,但是您可能需要一些额外的状态来处理所有情况(例如,从检查到未检查)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top