編集可能な DataGridTemplateColumn があります。ビジネス オブジェクトが何らかの基準を満たしている場合にのみ、ユーザーがこの列のセルの内容を編集できるようにしたいと考えています。ビジネス オブジェクトが INotifyPropertyChanged を実装し、Name、Department、およびSalesの 3 つのプロパティを持っているとします。 NameとDepartmentは文字列で、Salesは double です。
Departmentが "Retail"の場合にのみ、ユーザーがSales値を編集できるようにしたいと考えています。これを行うために使用できるデータグリッドは次のとおりです。
<DataGrid ItemsSource="{Binding Path=MyTypeCollection}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name, Mode=OneTime}" IsReadOnly="True" />
<DataGridTextColumn Header="Department" Binding="{Binding Path=Department, Mode=OneTime}" IsReadOnly="True" />
<DataGridTemplateColumn Header="Sales">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=Sales, Mode=TwoWay}" Visibility="{Binding Path={StaticResource ResourceKey=IsRetail}}" />
<TextBlock Text="{Binding Path=Sales, Mode=OneWay}" Visibility="{Binding Path={StaticResource ResourceKey=IsNotRetail}}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<StackPanel>
<TextBox Text="{Binding Path=Sales, Mode=TwoWay}" Visibility="{Binding Path={StaticResource ResourceKey=IsRetail}}" />
<TextBlock Text="{Binding Path=Sales, Mode=OneWay}" Visibility="{Binding Path={StaticResource ResourceKey=IsNotRetail}}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
2 つの Text 要素を持つスタック パネルを使用しています。テキスト要素の可視性でバインディングを使用して、テキスト要素を切り替えます。Departmentの値が "Retail" ではない行がある場合、セルが表示モードか編集モードかに関係なく、 Sales列に TextBlock を表示します。
これは私には不器用な解決策のようです。これらのタイプのセルが編集モードに完全に入らないようにする方法はありますか? 部門が「小売」の場合にのみ編集モードを許可したい。これは可能ですか?
編集:コードを追加します。
@レイチェル。ご協力ありがとうございました。すべてが正しいことを確認するために、すべてのデータグリッド XAML コードを貼り付けたいと考えています。
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=Data}">
<DataGrid.Resources>
<DataTemplate x:Key="TextBoxTemplate">
<TextBox Text="{Binding Path=Sales}" />
</DataTemplate>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Department" Binding="{Binding Path=Department, Mode=OneTime}" />
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name, Mode=OneTime}" />
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ContentControl x:Name="salesControl">
<TextBlock Text="{Binding Sales}" />
</ContentControl>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Department}" Value="Retail">
<Setter TargetName="salesControl" Property="ContentTemplate" Value="{StaticResource TextBoxTemplate}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Sales}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
私はこれをほとんど私が望むところに持っています。Sales
行の値をクリックするRetail
と、TextBox が表示されますが、値がありません (こちらを参照)。TextBoxTemplate の TextBox がバインドを指定しているため、値がない理由がわかりません。これがなぜなのか知っていますか?
編集: このソリューションにはもう 1 つの問題があることに気付きました。Sales 列の値を実際に編集することはできません。試してみると、元の編集前の値に戻ります。