WPF - 单元格行中的复选框是否可以读取?

时间:2011-07-21 15:55:54

标签: wpf

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

该对象具有布尔值。

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

有没有办法只读取该复选框?否则有一种方法可以告诉点击来自事件“已检查”和“未选中”的特定行,后者在代码后面执行方法?

谢谢!

3 个答案:

答案 0 :(得分:18)

您可以通过将IsHitTestVisible和Focusable设置为false来进行任何只读控制。

XAML:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfApplication1="clr-namespace:WpfApplication1">

    <StackPanel>
        <ListView ItemsSource="{Binding}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Name}" />
                    <GridViewColumn Header="Is Valid">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="{Binding Path=IsValid}" IsHitTestVisible="False" Focusable="False" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn> 
                </GridView>
            </ListView.View>
        </ListView>
    </StackPanel>

</Window>

代码背后:

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; }
        }
    }
}

答案 1 :(得分:0)

您可以重新ControlTemplate CheckBox移除RenderPressed并将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> 

答案 2 :(得分:0)

在CheckBox上放置透明TextBlock。 通过设置“IsEnabled”来禁用CheckBox,并使用此TextBlock上的ToolTip内容。 示例如下:

<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>