我想在按钮点击(MVVM模型)时刷新我的数据网格。在我的视图模型中,没有关于视图的参考。任何人都可以解释一下。
我想在按钮点击时使用DataGrid.Refresh()方法。我如何在MVVM模型中使用它。
答案 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。这对我有用。