【问题标题】:C# WPF DataGrid is not updated when binded to the DataTable programatically以编程方式绑定到 DataTable 时,C# WPF DataGrid 不会更新
【发布时间】:2019-12-04 02:19:12
【问题描述】:

ItemsSource 以编程方式绑定到 DataTable 时,DataGrid 不会更新。

我正在构建一个可以通过条件(通过 MVVM)更改其内部内容的用户控件。
Xaml 示例:

<Window ...>
    <grid x:Name="mainGrid" />
</Window>

代码隐藏:

public partial class MainWindow : Window
{
    public MainViewModel mvm { get; set; } = new MainViewModel();

    public MainWindow()
    {
        InitializeComponent();

        this.DataContext = mvm;

        var dataGrid = new DataGrid()
        {
            Width = 400,
            Height = 400,
            AutoGenerateColumns = true,
            IsReadOnly = true,
        };

        var binding = new Binding("DefaultView")
        {
            Source = mvm.TableSource,
            UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
        };

        BindingOperations.SetBinding(dataGrid, DataGrid.ItemsSourceProperty, binding);

        mainGrid.Children.Add(dataGrid);
    }

    private void button_Click_1(object sender, RoutedEventArgs e)
    {
        mvm.TableSource.Columns.Add("test" + new Random().Next());
        mvm.TableSource.Rows.Add("test" + new Random().Next());
        mvm.Refresh(); //force update
    }
}

MainViewModel 代码:

public class MainViewModel:ModelBase // ModelBase implements INotifyPropertyChanged
{
    public DataTable TableSource {get;set;} = new DataTable()

    public void Refresh()
    {
        var temp = TableSource;
        TableSource = null;
        OnPropertyChanged("TableSource");
        TableSource = temp;
        OnPropertyChanged("TableSource");
    }
}

我希望看到DataTable 以编程方式绑定到DataGrid 的内容(在这种情况下只添加空行),但它只有在通过XAML 绑定时才能正常工作。有什么我可能会错过的想法吗?

【问题讨论】:

  • 只有当你绑定到 TableSource 属性时,触发 OnPropertyChanged("TableSource") 才会有效果,而你并没有这样做。
  • var binding = new Binding("TableSource.DefaultView");。 DataContext 已经是mvm,所以不要费心设置SourceUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged 毫无意义,因为 ItemsSource 无法更新源属性。您是否期望它会给您一个新的DataTable 或其他东西?你也可以在Refresh() 中删除很多无操作的东西。 TableSource 应该在其 setter 中提升 PropertyChanged 本身,否则将 setter 设为私有。你这样自找麻烦。
  • @Ed 的想法似乎不是替换 TableSource 实例,这对于带有 PropertyChanged 的​​普通设置器来说是必需的。
  • @Clemens 哦,我明白了。我的脑海在某处添加了一个幻象new。我现在明白了。
  • @Clemens,确实,当您通过 xaml 绑定它时,它会以某种方式工作,例如 ItemsSource= { Binding TableSource.DefaultView, UpdateSourceTrigger=OnPropertyChanged } 并触发 OnPropertyChanged("TableSource") 。有没有办法在代码隐藏中获得相同的效果?

标签: c# wpf mvvm data-binding binding


【解决方案1】:

如何在代码中模仿相同的功能并不干净,所以我添加了一个解决方法,在实际绑定之前添加列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 2014-04-18
    • 2023-04-02
    • 2013-07-28
    • 2018-02-07
    • 2013-06-20
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多