WPF-单元格行中的复选框是否为只读?

WPF-单元格行中的复选框是否为只读?,wpf,Wpf,我有一个ListView,它动态绑定到同一类型的对象列表 对象具有布尔值 有一个ListView列,它显示一个复选框,而不是该特定属性的“true”和“false”正常值 <LinearGradientBrush x:Key="CheckRadioFillNormal"> <GradientStop Color="#FFD2D4D2" Offset="0"/> <GradientStop Color="#FFFFFFFF" Offset="1"/&g

我有一个ListView,它动态绑定到同一类型的对象列表

对象具有布尔值

有一个ListView列,它显示一个复选框,而不是该特定属性的“true”和“false”正常值

<LinearGradientBrush x:Key="CheckRadioFillNormal">
    <GradientStop Color="#FFD2D4D2" Offset="0"/>
    <GradientStop Color="#FFFFFFFF" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="CheckRadioStrokeNormal">
    <GradientStop Color="#FF004C94" Offset="0"/>
    <GradientStop Color="#FF003C74" Offset="1"/>
</LinearGradientBrush>
<Style x:Key="EmptyCheckBoxFocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <Rectangle Margin="1" SnapsToDevicePixels="true" Stroke="Black" StrokeThickness="1" StrokeDashArray="1 2"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Style x:Key="CheckRadioFocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <Rectangle Margin="14,0,0,0" SnapsToDevicePixels="true" Stroke="Black" StrokeThickness="1" StrokeDashArray="1 2"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Style x:Key="ReadonlyCheckBox" TargetType="{x:Type CheckBox}">
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="Background" Value="{StaticResource CheckRadioFillNormal}"/>
    <Setter Property="BorderBrush" Value="{StaticResource CheckRadioStrokeNormal}"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="FocusVisualStyle" Value="{StaticResource EmptyCheckBoxFocusVisual}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type CheckBox}">
                <BulletDecorator Background="Transparent" SnapsToDevicePixels="true">
                    <BulletDecorator.Bullet>
                        <Microsoft_Windows_Themes:BulletChrome BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" IsChecked="{Binding MyBoolean}" RenderMouseOver="{TemplateBinding IsMouseOver}"/>
                    </BulletDecorator.Bullet>
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </BulletDecorator>
                <ControlTemplate.Triggers>
                    <Trigger Property="HasContent" Value="true">
                        <Setter Property="FocusVisualStyle" Value="{StaticResource CheckRadioFocusVisual}"/>
                        <Setter Property="Padding" Value="2,0,0,0"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style> 
有没有办法将该复选框设置为只读?否则,有没有办法判断单击来自“checked”和“unchecked”事件中的这一特定行,这两个事件在代码隐藏中执行一个方法


谢谢

可以通过将IshittesVisible和Focusable设置为false,使任何控件成为只读控件

XAML:


代码隐藏:

using System.Collections.Generic;

namespace WpfApplication1
{
    public partial class Window1
    {
        public Window1()
        {
            InitializeComponent();

            List<DataItem> data = new List<DataItem>();
            data.Add(new DataItem() { Name = "AAA", IsValid = true });
            data.Add(new DataItem() { Name = "BBB" });
            DataContext = data;
        }

        public class DataItem
        {
            public string Name { get; set; }
            public bool IsValid { get; set; }
        }
    }
}
使用System.Collections.Generic;
命名空间WpfApplication1
{
公共部分类窗口1
{
公共窗口1()
{
初始化组件();
列表数据=新列表();
Add(newdataitem(){Name=“AAA”,IsValid=true});
data.Add(newdataitem(){Name=“BBB”});
数据上下文=数据;
}
公共类数据项
{
公共字符串名称{get;set;}
公共bool有效{get;set;}
}
}
}

您可以重新设置
复选框的
控制模板的样式,以删除
渲染的
,并将
IsChecked
绑定到
DataContext
属性,而不是
TemplateBinding
。这是已编辑的模板,请查找
IsChecked=“{Binding MyBoolean}”
,并将其更改为您的属性

<LinearGradientBrush x:Key="CheckRadioFillNormal">
    <GradientStop Color="#FFD2D4D2" Offset="0"/>
    <GradientStop Color="#FFFFFFFF" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="CheckRadioStrokeNormal">
    <GradientStop Color="#FF004C94" Offset="0"/>
    <GradientStop Color="#FF003C74" Offset="1"/>
</LinearGradientBrush>
<Style x:Key="EmptyCheckBoxFocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <Rectangle Margin="1" SnapsToDevicePixels="true" Stroke="Black" StrokeThickness="1" StrokeDashArray="1 2"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Style x:Key="CheckRadioFocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <Rectangle Margin="14,0,0,0" SnapsToDevicePixels="true" Stroke="Black" StrokeThickness="1" StrokeDashArray="1 2"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Style x:Key="ReadonlyCheckBox" TargetType="{x:Type CheckBox}">
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="Background" Value="{StaticResource CheckRadioFillNormal}"/>
    <Setter Property="BorderBrush" Value="{StaticResource CheckRadioStrokeNormal}"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="FocusVisualStyle" Value="{StaticResource EmptyCheckBoxFocusVisual}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type CheckBox}">
                <BulletDecorator Background="Transparent" SnapsToDevicePixels="true">
                    <BulletDecorator.Bullet>
                        <Microsoft_Windows_Themes:BulletChrome BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" IsChecked="{Binding MyBoolean}" RenderMouseOver="{TemplateBinding IsMouseOver}"/>
                    </BulletDecorator.Bullet>
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </BulletDecorator>
                <ControlTemplate.Triggers>
                    <Trigger Property="HasContent" Value="true">
                        <Setter Property="FocusVisualStyle" Value="{StaticResource CheckRadioFocusVisual}"/>
                        <Setter Property="Padding" Value="2,0,0,0"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style> 

将透明文本块置于复选框上。 通过设置“IsEnabled”禁用复选框,并使用此文本块上的工具提示内容。 示例如下:

<DataGridTemplateColumn Header="Hdr" Width="34" >
   <DataGridTemplateColumn.CellTemplate>
      <DataTemplate>
         <Grid>
            <CheckBox  VerticalAlignment="Center" HorizontalAlignment="Center" IsEnabled="False" IsChecked="{Binding IS_CHECKED}"/>
             <TextBlock>
               <ToolTipService.ToolTip>
                 <ToolTip Content="{Binding TOOL_TP}"/>
               </ToolTipService.ToolTip>
         </TextBlock>
         </Grid>
      </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

谢谢!这就是我要找的。