rou*_*lee 15 wpf binding wpfdatagrid c#-4.0
我正在使用wpf 4.0中的datagrid.这有一个包含复选框的TemplateColumn.复选框的IsChecked属性通过绑定设置.
问题是,即使我明确指定绑定模式为TwoWay,它只能在一个方向上工作.
我必须提到,相同的代码在.net 3.5中与wpf工具包中的datagrid完美配合.
请查看.xaml和.cs内容.
提前致谢,
罗兰
<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>
Run Code Online (Sandbox Code Playgroud)
和相关的.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
}
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*asz 34
您在datatemplate中的Checkbox IsChecked绑定中设置UpdateSourceTrigger = PropertyChanged:
<CheckBox
IsChecked="{Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
/>
Here's the deal, the way the data grid works, is that it creates a data view and displays it instead of the original data, therefore when you simply bind a property in the CellTemplate
it doesn't get propagated from the view to the data.
What you need to do is use the CellEditingTemplate
so that the data grid knows when you're editing, and can propagate it to the data when done (or it can undo it if you cancel).
Here's the modified XAML for you:
<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"
/>
...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15387 次 |
最近记录: |