初歩的な質問になりますが、DataGridTextColumnのCellStyleに対してViewModelのプロパティでDataTriggerを仕掛けても期待通りの動作となりませんでした。
詳細としては、以下の通りシンプルなViewにbool型のIsEditプロパティを指定し、ViewModel側でTrue/Falseを切り替えてもBorderBrushに変化がありませんでした。IsEditをDataGrid以外のほかの要素に同様にStyle Triggerを指定すると正しく動作するのでbindは問題なさそうです。
一方、ItemSourceとしてバインドしているItemsコレクションのAgeプロパティをDataTriggerとしてBindingに指定しValueへ任意の数値を指定し、DataGrid上でその数値を入力するとStyleは正しく適用されます。
bool型プロパティで指定した場合、なぜTriggerは動作しないのでしょうか?
View
<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="名前" Width="150" Binding="{Binding Name}"/> <DataGridTextColumn Header="年齢" Width="100" Binding="{Binding Age}"> <DataGridTextColumn.CellStyle> <Style TargetType="{x:Type DataGridCell}"> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="#87CEEB"/> <Setter Property="Foreground" Value="Black"/> </Trigger> <DataTrigger Binding="{Binding IsEdit}" Value="True"> <Setter Property="BorderBrush" Value="Red"/> </DataTrigger> </Style.Triggers> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> </DataGrid.Columns> </DataGrid>
ViewModel
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using Livet; using Livet.Commands; using Livet.Messaging; using Livet.Messaging.IO; using Livet.EventListeners; using Livet.Messaging.Windows; using System.Collections.ObjectModel; namespace InspectDataGrid.ViewModels { public class MainWindowViewModel : ViewModel { private ObservableCollection<Item> items; public ObservableCollection<Item> Items { get { return items; } set { items = value; RaisePropertyChanged(); } } private bool isEdit; public bool IsEdit { get { return isEdit; } set { isEdit = value; RaisePropertyChanged(); } } private ViewModelCommand settruecommand; public ViewModelCommand SetTrueCommand { get { if (settruecommand ==null) { settruecommand = new ViewModelCommand(this.SetTrue); } return settruecommand; } } private ViewModelCommand setfalsecommand; public ViewModelCommand SetFalseCommand { get { if (setfalsecommand ==null) { setfalsecommand = new ViewModelCommand(this.SetFalse); } return setfalsecommand; } } public MainWindowViewModel() { this.Items = new ObservableCollection<Item>(); this.Items.Add(new Item("a", 24)); this.Items.Add(new Item("b", 25)); } public void Initialize() { } public void SetTrue() { this.IsEdit = true; } public void SetFalse() { this.IsEdit = false; } }
回答2件
あなたの回答
tips
プレビュー