Интересно, что я здесь делаю не так? У меня есть DataGrid с одним столбцом под названием Выбрано. Рядом с ним у меня есть CheckBox в DataGridTemplateColumn, который также привязан к полю "Выбрано". Идея состоит в том, что всякий раз, когда флажок установлен или снят, в выбранном поле должно отображаться 1 или 0 соответственно (т.е. логические значения). Это нормально работает.
Однако я хочу также разместить еще один флажок в разделе Заголовок столбца DataGridTemplateColumn, чтобы я мог установить или снять все флажки в разделе DataGridTemplateColumn.CellTemplate. Здесь у меня возникают проблемы, в то время как флажки в разделе DataGridTemplateColumn.CellTemplate проверяются или снимаются, соответствующие значения в выбранном поле вообще не меняются. Это как если бы привязка не удалась.
Что я делаю неправильно?
Вот простой XAML и код для загрузки данных в поле Выбрано.
<Grid>
<DataGrid Name = "MyDataGrid" AutoGenerateColumns = "False">
<DataGrid.Columns>
<DataGridTextColumn Width = "100" Binding = "{Binding Path=Selected}" Header = "Selected" />
<DataGridTemplateColumn Width = "80">
<DataGridTemplateColumn.Header>
<CheckBox Content = " Slect All" x:Name = "headerCheckBox" />
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox x:Name = "Mychk" HorizontalAlignment = "Center" IsChecked = "{Binding Selected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
<DataTemplate.Triggers>
<DataTrigger Binding = "{Binding ElementName=headerCheckBox, Path=IsChecked}" Value = "True">
<Setter TargetName = "Mychk" Property = "IsChecked" Value = "True" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
VB.Net
Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
Dim MyTable = New System.Data.DataTable
MyTable.Columns.Add("Selected", GetType(Integer))
For Each array As Object In New List(Of Integer)() From {0, 0, 0, 0, 0}
MyTable.Rows.Add(array)
Next
MyDataGrid.ItemsSource = MyTable.DefaultView
End Sub
C#
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
{
System.Data.DataTable MyTable = new System.Data.DataTable();
MyTable.Columns.Add("Selected", typeof(int));
foreach (object array in new List<int> {0,0,0,0,0})
{
MyTable.Rows.Add(array);
}
MyDataGrid.ItemsSource = MyTable.DefaultView;
}
}
}
Кстати, я пытаюсь делать все в XAML без кода (тоже без конвертера)
Тем не менее, ваша проблема, безусловно, объяснено здесь. Переместите привязку IsChecked в средство настройки стилей.
Привет, Клеменс, я перешел по предоставленной ссылке и внес следующие изменения в CheckBox внутри CellTemplate <CheckBox x: Name = "Mychk" HorizontalAlignment = "Center"> <CheckBox.Style> <Style TargetType = "CheckBox"> <Setter Property = "IsChecked" Value = "{Выбранная привязка, UpdateSourceTrigger = PropertyChanged, Mode = TwoWay}" /> </Style> </CheckBox.Style> </CheckBox>. Все еще не работает
Дело в том, что я могу сделать это в программном коде. Я действительно хотел избежать кода, включающего преобразователь значений. Возможно, вы можете попробовать и опубликовать рабочее решение





Вероятно, вы могли бы использовать MultiBinding для свойства Mychk.IsChecked. MultiBinding будет содержать текущую привязку плюс привязку из DataTrigger, а многозначный преобразователь создаст ожидаемый результат.