2011-10-06 28 views
1

我有一個WPF datagrid,我創建了一個ControlTemplate,用於表示bool?類型的複選框。 我想爲複選框/控制模板爲只讀到用戶,但可以改變數值如何在WPF/MVVM中只讀控件模板(對於複選框)?

這裏是模板:

<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

呦你希望你的CheckBox只是ReadOnly,但你希望用戶能夠改變它的Checked值?那麼爲什麼你只需要ReadOnly?只是爲了風格? – Rachel

+0

@Rachel:只讀給用戶,可從代碼編輯。 –

+0

@jberger我以爲你是OP,因此根據你的評論張貼了一個答案。現在意識到你不是,所以回答可能不適用於他的情況。 – Rachel

回答

3

您可以在複選框上設置IsHitTestVisible =「false」或IsEnabled =「false」。

+0

完美的簡單解決方案 –

+0

不是一個完美的解決方案。移動焦點到複選框並按空格鍵即使IsHitTestVisible = False –

0

最簡單的方法使它只讀以將其移動到具有幾乎透明背景的某個控件後面。

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

Yep,agree,IsEnabled =「false」更容易:) –

0

如果您正在編輯從代碼選中的值,你應該編輯綁定源(IsReady),而不是CheckBox.Checked值。設置MyCheckBox.Checked將覆蓋綁定,並且不會將更改保存到您的IsReady屬性。

它優先於IsReady財產從您的視圖模型的變化,但如果你必須從查看我通常投CheckBox的DataContext的,以我的數據對象之後從那裏做,並設置綁定屬性

像這樣的東西:

((MyDataObject)MyCheckBox.DataContext).IsReady = false; 

至於讓一個CheckBox只讀到用戶,設置它的IsEnabled屬性設置爲false

<CheckBox x:Name="MyCheckBox" IsEnabled="False" IsChecked="{Binding IsReady}" /> 
+0

我認爲'IsReady'應該只從ViewModel更新(和而不是View代碼轉換爲ViewModel類型)。 –

相關問題