私はviewmodelにバインドするビューがあることを納得しました。私のコードでは、このビューモデルには、gridview ItemsSourceにバインドする要素のコレクションと、列ヘッダーの状態を表すプロパティHeaderCheckedがあります。すべての要素には、IsCheckedプロパティがあります。確かにViewModelはINotifyPropertyChangedをサポートします。
これはViewModelに(DataEventsSourceだけでINotifyPropertyChangedのを実装)のコードです:コレクションの要素が変更された場合
public class MainViewModel : DataEventsSource
{
private ObservableCollection<Element> _elements = new ObservableCollection<Element>
{
new Element {IsChecked = false},
new Element {IsChecked = false},
new Element {IsChecked = false},
new Element {IsChecked = false}
};
public MainViewModel()
{
foreach (var element in _elements)
{
element.PropertyChanged += OnElementPropertyChanged;
}
}
private void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "IsChecked")
{
bool? headerChecked = null;
if (Elements.All(el => el.IsChecked))
{
headerChecked = true;
}
if (Elements.All(el => !el.IsChecked))
{
headerChecked = false;
}
HeaderChecked = headerChecked;
}
}
public ObservableCollection<Element> Elements
{
get
{
return _elements;
}
set
{
_elements = value;
}
}
private bool? _headerChecked = false;
public bool? HeaderChecked
{
get
{
return _headerChecked;
}
set
{
_headerChecked = value;
OnPropertyChanged("HeaderChecked");
}
}
}
public class Element : DataEventsSource
{
private bool _isChecked;
public bool IsChecked
{
get
{
return _isChecked;
}
set
{
_isChecked = value;
OnPropertyChanged("IsChecked");
}
}
}
ご覧のように、HeaderCheckedプロパティはOnElementPropertyChanged方法で更新されます。
これは図である。
分離コード:
public partial class MainWindow
{
private readonly MainViewModel _viewModel = new MainViewModel();
public MainWindow()
{
InitializeComponent();
DataContext = _viewModel;
}
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
foreach (var element in _viewModel.Elements)
{
element.IsChecked = true;
}
}
private void CheckBox_UnChecked(object sender, RoutedEventArgs e)
{
foreach (var element in _viewModel.Elements)
{
element.IsChecked = false;
}
}
}
そしてXAML(それは簡単のため1列のみを含有する)からメイングリッド次:
<Grid x:Name="LayoutRoot">
<DataGrid x:Name="dataGrid" CanUserAddRows="False" AutoGenerateColumns="False" ItemsSource="{Binding Elements}">
<DataGrid.Columns>
<DataGridCheckBoxColumn x:Name="checkboxColumn" Binding="{Binding IsChecked, Mode=TwoWay}" IsThreeState="True" Width="50" >
<DataGridCheckBoxColumn.HeaderTemplate>
<DataTemplate x:Name="dtAllChkBx">
<CheckBox Name="cbxAll" Content="Label" IsChecked="{Binding Path=DataContext.HeaderChecked, ElementName=LayoutRoot, Mode=TwoWay}" Checked="CheckBox_Checked" Unchecked="CheckBox_UnChecked"></CheckBox>
</DataTemplate>
</DataGridCheckBoxColumn.HeaderTemplate>
</DataGridCheckBoxColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
私はこのコードがあなたを助けてくれることを願っています。私があなたに誤解した場合は、教えてください。
あなたがDataGridのあなたのXAMLを追加することはできますか?あなたの問題をよく理解していませんでした。 – Nikolay
@Nikolay: <チェックボックス名= "cbxAll" コンテンツ= "{X:静的プロパティ:Resources.lblAll}" チェック= "CheckBox_Checked" オフ= "CheckBox_Unchecked"> DataTemplateを> DG:DataGridCheckBoxColumn。 HeaderTemplate> dg:DataGridCheckBoxColumn> –
iYadav
イベントハンドラを使用している場合は、グリッドチェックボックスのCheckedハンドラでヘッダーチェックボックスをチェックするかチェックしないで手動で設定できます。または、バインディングを使用する場合は、ヘッダーチェックボックスをAllCheckedプロパティにバインドしてDataContextクラスに実装できます。 – Nikolay