【发布时间】:2015-09-21 05:52:02
【问题描述】:
我想在单击按钮时刷新我的数据网格(MVVM 模型)。在我的视图模型中,没有关于视图的参考。谁能解释一下。
我想在单击按钮时使用 DataGrid.Refresh() 方法。我如何在 MVVM 模型中使用它。
【问题讨论】:
-
首先在 mvvm 中没有没有按钮点击,其次我想刷新我的 DataGrid。
标签: wpf
我想在单击按钮时刷新我的数据网格(MVVM 模型)。在我的视图模型中,没有关于视图的参考。谁能解释一下。
我想在单击按钮时使用 DataGrid.Refresh() 方法。我如何在 MVVM 模型中使用它。
【问题讨论】:
标签: wpf
将您的数据项设置为ObservableCollection,并将dataGrid 的itemSource 与ObservableCollection 绑定。
如果条目将被添加/删除或移动到此集合,Datagrid 将被刷新。
【讨论】:
您需要将 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();
}
}
【讨论】:
我正在使用绑定到 DataGrid 的 DataTable。如果我将列添加到 DataTable,DataGrid 不会更新 UI。为了强制它通过 ViewModel 执行,我首先将 DataTable 属性设置为 null(暂时保存),然后将其设置回原始 DataTable。这对我有用。
【讨论】: