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

时间:2011-10-06 12:06:04

标签: wpf mvvm controltemplate

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

最简单的方法是将其简单地移动到几乎透明背景的某个控件之后。

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

答案 2 :(得分:0)

如果您正在编辑代码中的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}" />