Как сделать ControlTemplate (для флажка) только для чтения в WPF / MVVM? - PullRequest
1 голос
/ 06 октября 2011

У меня есть таблица данных 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>

Вот реализация в сетке данных:

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

Ответы [ 3 ]

3 голосов
/ 06 октября 2011

Вы можете установить флажок IsHitTestVisible = "false" или IsEnabled = "false".

0 голосов
/ 07 октября 2011

Если вы редактируете проверенное значение из кода, вы должны редактировать источник привязки (IsReady), а не значение CheckBox.Checked. Установка MyCheckBox.Checked перезапишет привязку и не сохранит изменения в свойстве IsReady.

Желательно изменить свойство IsReady из вашей ViewModel, но если вы должны сделать это из-за представления, я обычно приводил DataContext CheckBox к моему объекту данных и устанавливал привязанное свойство оттуда

Примерно так:

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

Что касается создания CheckBox только для чтения для пользователя, установите для его свойства IsEnabled значение false

<CheckBox x:Name="MyCheckBox" IsEnabled="False" IsChecked="{Binding IsReady}" />
0 голосов
/ 06 октября 2011

Самый простой способ сделать его доступным только для чтения, чтобы переместить его за какой-то элемент управления с почти прозрачным фоном.

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