【问题标题】:Why is wpf UpdateSourceTrigger not binding explicitly?为什么 wpf UpdateSourceTrigger 没有显式绑定?
【发布时间】:2015-06-10 20:45:09
【问题描述】:

我在 DataGrid 和对象之间进行了双向绑定。我只想在用户单击保存按钮时将在 DataGrid 中所做的更改保存到对象。作为第一步,我设置 UpdateSourceTrigger=Explicit。当我将该属性设置为显式时,我预计不会发生绑定(因为我还没有调用 UpdateSource()),但与我的预期相反,当我关闭并重新启动程序时,更改将绑定到对象。

为什么我的更改仍然绑定到我的对象设置?

这是我的 xaml 文件中的相关 DataGrid 代码:

<DataGrid x:Name="DataGrid1" IsReadOnly="False"
                 AutoGenerateColumns="False" CanUserAddRows="False" SelectionUnit="Cell"
                  ItemsSource="{Binding data}">
            <DataGrid.DataContext>
                <Binding Source="{StaticResource myData}" UpdateSourceTrigger="Explicit"/>
            </DataGrid.DataContext>

            <DataGrid.Columns>
                <DataGridTextColumn Header="Field" Binding="{Binding Path=name, Mode=TwoWay, 
                        UpdateSourceTrigger=Explicit}" Width="Auto"/>
                <DataGridTextColumn Header="Length of Field" Binding="{Binding Path=length, Mode=TwoWay, 
                        UpdateSourceTrigger=Explicit}" Width="Auto"/>
            </DataGrid.Columns>
</DataGrid>

【问题讨论】:

  • 你能发布一个最小(非)工作示例吗?什么是数据对象?你在使用依赖属性吗?你在使用视图模型吗?

标签: c# wpf xaml datagrid updatesourcetrigger


【解决方案1】:

尝试使用 DataGridTemplateColumn 而不是 TextColumn:

<Window x:Class="DataGridUpdateSourceTriggerOneWay.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:DataGridUpdateSourceTriggerOneWay"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <DataGrid x:Name="DataGrid1" 
              IsReadOnly="False"
              AutoGenerateColumns="False"
              CanUserAddRows="False"
              SelectionUnit="Cell"
              ItemsSource="{Binding data}">

        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Field">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding Path=Name, Mode=TwoWay, 
                    UpdateSourceTrigger=Explicit}" Width="Auto"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Length of Field">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding Path=Length, Mode=TwoWay, 
                    UpdateSourceTrigger=Explicit}" Width="Auto"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

数据类在这里:

public class Data : INotifyPropertyChanged
{
    private string _Name;

    public string Name
    {
        get { return _Name; }
        set
        {
            _Name = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Name"));
        }
    }

    private int _Length;

    public int Length
    {
        get { return _Length; }
        set
        {
            _Length = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Length"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate { };
}

还有我的测试代码:

public partial class MainWindow : Window
{
    public ObservableCollection<Data> data { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        data = new ObservableCollection<Data>();
        data.Add(new Data() { Name = "Data1", Length = 1 });
        data.Add(new Data() { Name = "Data2", Length = 2 });
        this.DataContext = this;
    }
}

它只会在开始时触发 PropertyChanged 事件,之后从 GUI 修改值时不会触发。所以最后,您将能够从后面的代码中保存您的修改。

【讨论】:

  • 现在将格式从 DataGridTextColumn 更改为 DataGridTemplateColumn 可以显式绑定(:知道为什么 DataGridTextColumn 不起作用吗?
猜你喜欢
  • 2010-11-19
  • 2015-01-06
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
相关资源
最近更新 更多