Проблема двустороннего связывания столбца шаблона таблицы данных wpf 4.0
Я использую сетку данных из wpf 4.0. Здесь есть TemplateColumn, содержащий флажок. Свойство IsChecked флажка устанавливается через привязку.
Проблема в том, что даже если я явно указываю режим привязки для TwoWay, он работает только в одном направлении.
Я должен упомянуть, что тот же код прекрасно работает в.net 3.5 с сеткой данных из набора инструментов wpf.
Пожалуйста, ознакомьтесь с содержимым.xaml и.cs.
Заранее спасибо,
Roland
<Window.Resources>
<DataTemplate
x:Key="IsSelectedColumnTemplate">
<CheckBox
IsChecked="{Binding Path=IsSelected, Mode=TwoWay}"
/>
</DataTemplate>
</Window.Resources>
<Grid>
<DataGrid
x:Name="dataGrid"
AutoGenerateColumns="false"
CanUserAddRows="False"
CanUserDeleteRows="False"
HeadersVisibility="Column"
ItemsSource="{Binding}"
>
<DataGrid.Columns>
<DataGridTemplateColumn
Header="Preselected"
x:Name="myIsSelectedColumn"
CellTemplate="{StaticResource IsSelectedColumnTemplate}"
CanUserSort="True"
SortMemberPath="Orientation"
Width="Auto"
/>
</DataGrid.Columns>
</DataGrid>
</Grid>
и связанный контент.cs:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ObservableCollection<DataObject> DataSource = new ObservableCollection<DataObject>();
DataSource.Add(new DataObject());
DataSource.Add(new DataObject());
dataGrid.ItemsSource = DataSource;
}
}
public class DataObject : DependencyObject
{
public bool IsSelected
{
get { return (bool)GetValue(IsSelectedProperty); }
set { SetValue(IsSelectedProperty, value); }
}
// Using a DependencyProperty as the backing store for IsSelected. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsSelectedProperty =
DependencyProperty.Register("IsSelected", typeof(bool), typeof(DataObject), new UIPropertyMetadata(false, OnIsSelectedChanged));
private static void OnIsSelectedChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
// this part is not reached
}
}
2 ответа
Вы устанавливаете UpdateSourceTrigger=PropertyChanged в привязке вашего флажка IsChecked в табличке данных:<CheckBox
IsChecked="{Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
/>
Дело в том, как работает сетка данных: она создает представление данных и отображает его вместо исходных данных, поэтому, когда вы просто связываете свойство в CellTemplate
это не распространяется от представления к данным.
Что вам нужно сделать, это использовать CellEditingTemplate
так, чтобы сетка данных знала, когда вы редактируете, и может распространить ее на данные, когда это будет сделано (или она может отменить ее, если вы отмените ее).
Вот модифицированный XAML для вас:
<Window.Resources>
<DataTemplate x:Key="IsSelectedColumnTemplate">
<TextBlock Text="{Binding IsSelected}"/>
</DataTemplate>
<DataTemplate x:Key="IsSelectedColumnTemplateEditing">
<CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay}"/>
</DataTemplate>
</Window.Resources>
...
<DataGridTemplateColumn
Header="Preselected"
x:Name="myIsSelectedColumn"
CellTemplate="{StaticResource IsSelectedColumnTemplate}"
CellEditingTemplate="{StaticResource IsSelectedColumnTemplateEditing}"
CanUserSort="True"
Width="Auto"
/>
...