【问题标题】:How to refresh my DataGrid using MVVM如何使用 MVVM 刷新我的 DataGrid
【发布时间】:2015-09-21 05:52:02
【问题描述】:

我想在单击按钮时刷新我的数据网格(MVVM 模型)。在我的视图模型中,没有关于视图的参考。谁能解释一下。

我想在单击按钮时使用 DataGrid.Refresh() 方法。我如何在 MVVM 模型中使用它。

【问题讨论】:

标签: wpf


【解决方案1】:

将您的数据项设置为ObservableCollection,并将dataGrid 的itemSource 与ObservableCollection 绑定。 如果条目将被添加/删除或移动到此集合,Datagrid 将被刷新。

【讨论】:

  • 我想在单击按钮时使用 DataGrid.Refresh() 方法。我如何在 MVVM 模型中使用它。
  • 您只需为按钮创建命令并将方法绑定到该命令。在该方法中,刷新您的收藏。
【解决方案2】:

您需要将 DataGrid 数据绑定到视图模型中的某个集合:

<DataGrid ItemsSource="{Binding Items}">...</DataGrid>

然后,如果您的 Items 属性的类型为 ObservableCollection,则在从 Items 集合中添加或删除项目时,DataGrid 会自动刷新。无需致电DataGrid.Refresh() - 这就是 MVVM 让事情变得更简单的原因。

public class MainWindowViewModel : ViewModelBase
{
    public MainWindowViewModel()
    {
        Items = new ObservableCollection<SomeClass>();
        //add some test data
        Items.Add(new SomeClass());
        Items.Add(new SomeClass());

        RefreshCommand = new DelegateCommand(Refresh);
    }

    public DelegateCommand RefreshCommand { get private set; }

    public ObservableCollection<SomeClass> Items { get; private set; }

    private void Refresh()
    {
        Items.Clear();

        //add actual items
        Items.Add(new SomeClass());
        Items.Add(new SomeClass());
    }
}

或者,您可以创建 Items 集合的新实例:

    private void Refresh()
    {
        //in this case, items doesn't have to be ObservableCollection, but any collection type
        Items = new ObservableCollection<SomeClass>             {
           new SomeClass(),
           new SomeClass()
        };
        OnPropertyChanged("Items");
    }

如果你真的需要访问 UIElement,那么当 viewmodel 中发生某些事情时,从代码隐藏中执行它(使用 viewmodel 事件来通知视图,发生了某些事情)。在下面的示例中,我使用 PropertyChanged 事件通知视图,视图模型中的某些内容已更改,视图负责刷新视图模型。

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow 
{
    public MainWindow()
    {
        InitializeComponent();

        DataContext = new MainWindowViewModel();
        ((MainWindowViewModel) DataContext).PropertyChanged += ViewModel_PropertyChanged;
    }

    void ViewModel_PropertyChanged(object s, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "Items")
        {
            MyDataGrid.Refresh();
        }
    }

【讨论】:

    【解决方案3】:

    我正在使用绑定到 DataGrid 的 DataTable。如果我将列添加到 DataTable,DataGrid 不会更新 UI。为了强制它通过 ViewModel 执行,我首先将 DataTable 属性设置为 null(暂时保存),然后将其设置回原始 DataTable。这对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-28
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多