wpf 4.0 datagrid模板列双向绑定问题

Posted

技术标签:

【中文标题】wpf 4.0 datagrid模板列双向绑定问题【英文标题】:wpf 4.0 datagrid template column two-way binding problem 【发布时间】:2011-02-25 03:45:06 【问题描述】:

我正在使用 wpf 4.0 中的数据网格。这有一个包含复选框的 TemplateColumn。复选框的 IsChecked 属性是通过绑定设置的。

问题是,即使我将绑定模式明确指定为 TwoWay,它也只能在一个方向上工作。

我不得不提到,相同的代码在 .net 3.5 中与 wpf 工具包中的数据网格完美配合。

请查看 .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>

以及相关的.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
    

【问题讨论】:

【参考方案1】:

您在数据模板的 Checkbox IsChecked 绑定中设置了 UpdateSourceTrigger=PropertyChanged: <CheckBox IsChecked="Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged" />

【讨论】:

这很好用,但没有按预期工作。当您键入一个字母时,它会立即更改对象。如果您有一个触发验证处理程序的触发器会发生什么。这意味着如果您输入 1000 个符号,它会触发 1000 次?这是不对的。 这可能是一个可接受的解决方案,跟踪 LostFocus 事件。 @Dilshod 如果一个类型输入 1000 个符号,它会触发 1000 次是什么意思?我们说的是复选框,对吧? @Sese 在这种情况下,您使用 CheckBox 很好,但如果您使用 TextBox 并绑定到属性,它会在每次按键时触发 PropertyChanged 事件。【参考方案2】:

这里的交易,数据网格的工作方式是它创建一个数据视图并显示它而不是原始数据,因此当您只是在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"
/>
...

【讨论】:

我认为这不是真的。如果没有使用 Sese 的答案的 CellEditingTemplate,它对我来说非常适合。 CellEditingTemplate 看起来会使事情变得过于复杂,并使用户更难使用。点击复选框肯定需要多次点击。

以上是关于wpf 4.0 datagrid模板列双向绑定问题的主要内容,如果未能解决你的问题,请参考以下文章

WPF中添加一个Datagrid使用dataset双向绑定,在第一列中添加一列checkbox用来选择本行,

WPF 在datagrid模板列中添加用户控件,在后台如何快速的检索到该控件。急!!!

如何修复 WPF Datagrids 中的“双向绑定需要路径或 XPath”异常?

如何在WPF Datagrids中修复“双向绑定需要路径或XPath”异常?

DataGridCheckboxColumn 双向绑定

wpf mvvm DataGird 按钮事件