У меня есть приложение WPF MVVM, у которого есть сетка данных WPF Toolkit, связанная с наблюдаемой коллекцией.Один из столбцов - это DataGridTemplateColumn, который реализует столбец переключаемых кнопок:
<dg:DataGrid ItemsSource="{Binding Path=LlistatDocuments}"
AutoGenerateColumns="False"
CanUserAddRows="False" CanUserResizeRows="False"
SelectionMode="Single"
ColumnWidth="*"
AlternationCount="2" AlternatingRowBackground="Bisque"
Focusable="False" SelectionUnit="FullRow"
CellStyle="{StaticResource Body_Content_DataGrid_Centering}"
GridLinesVisibility="All">
<dg:DataGrid.Resources>
<proxy:BindingProxy x:Key="myProxy" Data="{Binding}" />
</dg:DataGrid.Resources>
<dg:DataGrid.Columns>
<dg:DataGridTemplateColumn Header="Selection"
MinWidth="65" Width="Auto"
CanUserResize="False">
<dg:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ToggleButton Background="Transparent" Content="" IsChecked="{Binding Path=Data.IsSelected, Source={StaticResource myProxy}, Mode=TwoWay}" BorderBrush="Transparent">
<ToggleButton.Template>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<StackPanel Orientation="Horizontal" Background="Transparent">
<Image MaxWidth="32" MaxHeight="32">
<Image.Style>
<Style>
<Setter Property="Image.Source" Value="/My.App.Graphics;component/Images/Unchecked.png" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type ToggleButton}}}" Value="True">
<Setter Property="Image.Source" Value="/DiR.Utilitats.RecursosGrafics;component/PNG/Checked.png" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<ContentPresenter Content="{TemplateBinding Content}" Margin="0,0,0,0" />
</StackPanel>
</ControlTemplate>
</ToggleButton.Template>
</ToggleButton>
</DataTemplate>
</dg:DataGridTemplateColumn.CellTemplate>
</dg:DataGridTemplateColumn>
</dg:DataGrid.Columns>
</dg:DataGrid
Модель :
public class MyModel
{
public int Id { get; set; }
public bool IsSelected { get; set; }
}
Просмотреть модель :
private ObservableCollection<MyModel> _myDataGridItems;
public ObservableCollection<MyModel> MyDataGridItems
{
get
{
return this._myDataGridItems;
}
set
{
this._myDataGridItems = value;
OnPropertyChanged("MyDataGridItems");
}
}
private bool _isSelected;
public bool IsSelected
{
get
{
return this._isSelected;
}
set
{
this._isSelected = value;
// Do other stuff.
// Here MyDataGridItems collection has not changed to selected yet for the selected item.
OnPropertyChanged("IsSelected");
}
}
Прокси :
public class BindingProxy : Freezable
{
#region Overrides of Freezable
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
#endregion
public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
// Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}
Когда я щелкаю по элементу сетки данных (столбец DataGridTemplateColumn), свойство IsSelected правильно достигается, но в этот момент соответствующий элементв коллекции MyDataGridItems еще не было изменено на IsSelected = true или IsSelected = false.Зачем?Это изменение еще не отражено в коллекции MyDataGridItems.