【问题标题】:DataTable not binding to DataGrid in WPF MVVM [closed]DataTable 未绑定到 WPF MVVM 中的 DataGrid [关闭]
【发布时间】:2019-12-22 02:44:42
【问题描述】:

无法弄清楚为什么我的 DataGrid 在填充绑定的 DataTable 时没有填充。我检查了其他 Stackoverflow 帖子,但似乎没有任何问题可以解决我的问题。我知道我的 DataTable 被填满了,因为行数超过 50。填充 DataTable (ReturnOperators) 的方法被成功调用(它是在更改列表框中的 SelectedItem 时)

这是我的代码:

Xaml:

                 <DataGrid x:Name="dgOperators"
                        ItemsSource="{Binding DtOperators}"
                  AutoGenerateColumns="True"
                      Background="#0d0d0d"
                      Foreground="White"
                      Margin="10"
                     Grid.Row="1"
                  IsReadOnly="True" />

MainWindow.xaml.cs:

私有 ViewModel 虚拟机;

    public MainWindow()
    {
        InitializeComponent();
        vm = new ViewModel();
        this.DataContext = vm;
    }

视图模型:

private DataTable dtOperators;

    public DataTable DtOperators
    {
        get { return dtOperators; }
        set
        {
            dtOperators = value;
            OnPropertyChanged("DtOperators");
        }
    }

    public void ReturnOperators()
    {

        string query = "My SQL Query Here";
        using (SqlConnection con = new SqlConnection(connectionString))
        using (SqlCommand cmd = new SqlCommand(query, con))
        using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
        {
            DtOperators.Clear();
            adapter.Fill(DtOperators);
        }
    }

【问题讨论】:

  • 您的 ViewModel 是否从接口 (INotifyPropertyChanged) 继承并覆盖 PropertyChangedEventHandler?从您提供的 ViewModel 代码中我无法完全判断,您的 OnPropertyChanged 事件是否成功触发?
  • 是的。 ViewModel 从实现 INotifyPropertyChanged 的​​ ViewModelBase 继承。它正在处理我的 ViewModel 中的其他属性。
  • @JEllery 我已经设法让它工作(部分)。 adapter.Fill() 出于某种原因没有设置 DtOperators。我填写了一个辅助 DataTable 'dt',然后有 DtOperators = dt 并且它可以工作。不知道为什么我必须这样做......
  • DtOperators 在您尝试填充它时可能仍然为空。在您的 ViewModel 构造函数中实例化 DataTable(即 DtOperators = new DataTable();)
  • adapter.Fill(DtOperators); 确实显然没有为DtOperators 属性分配新值。因此当然不会调用属性设置器和OnPropertyChanged("DtOperators")

标签: c# wpf visual-studio mvvm datagrid


【解决方案1】:

将属性值传递给类似的方法

adapter.Fill(DtOperators)

显然没有为属性分配新值。因此没有触发 DtOperators 设置器。

我将 ReturnOperators() 修改为以下内容。通过填充另一个 DataTable,然后将 DtOperators 设置为该 DataTable,它就可以工作了。

public void ReturnOperators()
    {            
        string query = @"SELECT TOP 1000 [Store],[opid],[last4],[repeatserve_Count] FROM [POS].[dbo].[LVRC_Summary] WHERE repeatserve_count > 5";
        using (SqlConnection con = new SqlConnection(connectionString))
        using (SqlCommand cmd = new SqlCommand(query, con))
        using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
        {
            DtOperators.Clear();
            DataTable dt = new DataTable();
            adapter.Fill(dt);
            DtOperators = dt;
        }
    }

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 2023-04-02
    • 1970-01-01
    • 2013-03-24
    • 2012-03-06
    • 1970-01-01
    • 2013-07-28
    • 2011-08-17
    • 2013-06-20
    相关资源
    最近更新 更多