2011-07-21 39 views
3

我有一個ListView動態綁定到相同類型的對象列表。WPF - 單元行中的複選框只能讀取?

該對象有一個布爾值。

有一個ListView列顯示覆選框,而不是該特定屬性的「true」和「false」正常值。

有沒有辦法將該複選框設置爲只讀?否則有沒有辦法告訴點擊來自這個特定行中的「checked」和「unchecked」事件在後面的代碼中執行一個方法?

謝謝!

回答

16

可以通過將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; } 
     } 
    } 
} 
+0

謝謝!那是我正在尋找的。 – Rushino

0

可以restyle CheckBoxControlTemplate刪除RenderPressed並結合IsCheckedDataContext屬性,而不是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> 
0

在CheckBox上放置透明TextBlock。 通過設置「IsEnabled」fnd使用此TextBlock上的ToolTip內容來禁用CheckBox。 以下示例:

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