Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在WPF/MVVM中使ControlTemplate(用于复选框)成为只读?_Wpf_Mvvm_Controltemplate - Fatal编程技术网

如何在WPF/MVVM中使ControlTemplate(用于复选框)成为只读?

如何在WPF/MVVM中使ControlTemplate(用于复选框)成为只读?,wpf,mvvm,controltemplate,Wpf,Mvvm,Controltemplate,我有一个WPF数据网格,其中我为一个复选框创建了一个ControlTemplate来表示bool?类型。 我希望复选框/控件模板仅对用户可读,但能够更改值 以下是模板: <ControlTemplate x:Key="checkboxTemplate" TargetType="CheckBox"> <Grid Background="{TemplateBinding Background}" Height="{TemplateBinding Height}">

我有一个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>

以下是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>


您可以在复选框上设置IshitteVisible=“false”或IsEnabled=“false”。

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

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

如果要编辑代码中的选中值,则应编辑绑定源(
IsReady
),而不是
复选框。选中的
值。设置
MyCheckBox.Checked将覆盖绑定,而不会将更改保存到您的
IsReady
属性

最好从ViewModel中更改
IsReady
属性,但如果必须从视图后面执行此操作,我通常会将复选框的DataContext强制转换为我的数据对象,并从那里设置绑定属性

大概是这样的:

((MyDataObject)MyCheckBox.DataContext).IsReady = false;
要使复选框对用户只读,请将其
IsEnabled
属性设置为false

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


Yep,agree,IsEnabled=“false”更容易:)您希望您的复选框为只读,但希望用户能够更改其选中值?那你为什么要只读呢?只是为了风格?@Rachel:对用户来说是只读的,可以从代码中编辑。@jberger我以为你是OP,所以根据你的评论发布了一个答案。现在意识到你不是,所以答案可能不适用于他的情况。我认为
IsReady
应该只从ViewModel更新(而不是从视图中的代码转换为ViewModel类型)。完美的简单解决方案不是完美的解决方案。将焦点移动到复选框并按空格键可切换该复选框,即使ISITETSTVISIBLE=False