我有一个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>
答案 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}" />