如何在 WPF/MVVM 中将 ControlTemplate(用于复选框)设置为只读?

发布于 2024-12-08 14:48:39 字数 1625 浏览 0 评论 0原文

我有一个 WPF 数据网格,在其中为复选框创建了一个 ControlTemplate 来表示 bool? 类型。 我希望复选框/控件模板对用户只读,但能够更改值

这是模板:

<ControlTemplate x:Key="checkboxTemplate" TargetType="CheckBox">
    <Grid Background="{TemplateBinding Background}" Height="{TemplateBinding Height}">
        <Rectangle x:Name="r" Height="10" Width="40" HorizontalAlignment="Center" VerticalAlignment="Center" RadiusX="4" RadiusY="4"></Rectangle>
    </Grid>
    <ControlTemplate.Triggers>
        <Trigger Property="CheckBox.IsChecked" Value="True">
            <Setter Property="Fill" Value="#FF66D660" TargetName="r"></Setter>
        </Trigger>
        <Trigger Property="CheckBox.IsChecked" Value="False">
            <Setter Property="Fill" Value="#FFD50005" TargetName="r"></Setter>
        </Trigger>
        <Trigger Property="CheckBox.IsChecked" Value="{x:Null}">
            <Setter Property="Fill" Value="SlateGray" TargetName="r"></Setter>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

这是数据网格中的实现:

<DataGridTemplateColumn SortMemberPath="IsReady" Header="Ready" CanUserSort="True" IsReadOnly="True">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding IsReady, Mode=OneWay}" HorizontalAlignment="Center" Template="{StaticResource checkboxTemplate}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

I've got a WPF datagrid where I've created a ControlTemplate for a checkbox to represent a bool? type.
I'd like for the checkbox/control template to readonly to the user, but be able to change the value

Here's the template:

<ControlTemplate x:Key="checkboxTemplate" TargetType="CheckBox">
    <Grid Background="{TemplateBinding Background}" Height="{TemplateBinding Height}">
        <Rectangle x:Name="r" Height="10" Width="40" HorizontalAlignment="Center" VerticalAlignment="Center" RadiusX="4" RadiusY="4"></Rectangle>
    </Grid>
    <ControlTemplate.Triggers>
        <Trigger Property="CheckBox.IsChecked" Value="True">
            <Setter Property="Fill" Value="#FF66D660" TargetName="r"></Setter>
        </Trigger>
        <Trigger Property="CheckBox.IsChecked" Value="False">
            <Setter Property="Fill" Value="#FFD50005" TargetName="r"></Setter>
        </Trigger>
        <Trigger Property="CheckBox.IsChecked" Value="{x:Null}">
            <Setter Property="Fill" Value="SlateGray" TargetName="r"></Setter>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

Here's the implementation in the datagrid:

<DataGridTemplateColumn SortMemberPath="IsReady" Header="Ready" CanUserSort="True" IsReadOnly="True">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding IsReady, Mode=OneWay}" HorizontalAlignment="Center" Template="{StaticResource checkboxTemplate}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

萧瑟寒风 2024-12-15 14:48:39

您可以在复选框上设置 IsHitTestVisible="false" 或 IsEnabled="false"。

You can either set IsHitTestVisible="false" or IsEnabled="false" on the checkbox.

猫烠⑼条掵仅有一顆心 2024-12-15 14:48:39

使其只读的最简单方法是将其移动到具有几乎透明背景的某些控件后面。

<DataTemplate>
  <Border Opacity="0.01" Background="White">
   <CheckBox IsChecked="{Binding IsReady, Mode=OneWay}" HorizontalAlignment="Center" Template="{StaticResource checkboxTemplate}" />
  </Border>
</DataTemplate>

Easiest way to make it readonly to move it behind some control with almost transparent background.

<DataTemplate>
  <Border Opacity="0.01" Background="White">
   <CheckBox IsChecked="{Binding IsReady, Mode=OneWay}" HorizontalAlignment="Center" Template="{StaticResource checkboxTemplate}" />
  </Border>
</DataTemplate>
翻了热茶 2024-12-15 14:48:39

如果您要通过代码编辑 Checked 值,则应该编辑绑定源 (IsReady),而不是 CheckBox.Checked 值。设置 MyCheckBox.Checked 将覆盖绑定,并且不会将更改保存到 IsReady 属性。

最好从 ViewModel 更改 IsReady 属性,但如果必须从 View 后面执行此操作,我通常将 CheckBox 的 DataContext 转换为我的数据对象,并从那里设置绑定属性

,如下所示:

((MyDataObject)MyCheckBox.DataContext).IsReady = false;

至于使 CheckBox 对用户只读,请将其 IsEnabled 属性设置为 false

<CheckBox x:Name="MyCheckBox" IsEnabled="False" IsChecked="{Binding IsReady}" />

If you're editing the Checked value from code, you should be editing the binding source (IsReady), and not the CheckBox.Checked value. Setting MyCheckBox.Checked will overwrite the binding, and not save the change to your IsReady property.

It's preferred to change the IsReady property from your ViewModel, but if you must do it from behind the View I usually cast the CheckBox's DataContext to my data object, and set the bound property from there

Something like this:

((MyDataObject)MyCheckBox.DataContext).IsReady = false;

As for making a CheckBox read-only to the user, set it's IsEnabled property to false

<CheckBox x:Name="MyCheckBox" IsEnabled="False" IsChecked="{Binding IsReady}" />
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文