如何使用MVVM刷新我的DataGrid

时间:2015-07-03 11:37:59

标签: wpf

我想在按钮点击(MVVM模型)时刷新我的数据网格。在我的视图模型中,没有关于视图的参考。任何人都可以解释一下。

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您需要将DataGrid数据绑定到viewmodel中的某个集合:

<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事件来通知视图,viewmodel中的某些内容已更改,并且视图负责刷新视图模型。

/// <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();
        }
    }

答案 2 :(得分:0)

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