C# 为添加的行更新DataGrid,但不为添加的列更新DataGrid
我有一个MVVM应用程序,它的数据绑定到C# 为添加的行更新DataGrid,但不为添加的列更新DataGrid,c#,wpf,data-binding,mvvm,datagrid,C#,Wpf,Data Binding,Mvvm,Datagrid,我有一个MVVM应用程序,它的数据绑定到DataGrid,绑定到Resources。我向DataGrid中显示的资源数据中添加了一个额外的资源/行 private void OnResourceAddedToCollection(object sender, ResourceCollectionChangedEventArgs e) { var viewModel = new ResourceViewModel(e.NewResource); Resources.Add(view
DataGrid
,绑定到Resources
。我向DataGrid
中显示的资源数据中添加了一个额外的资源/行
private void OnResourceAddedToCollection(object sender, ResourceCollectionChangedEventArgs e)
{
var viewModel = new ResourceViewModel(e.NewResource);
Resources.Add(viewModel);
}
这很有效。但是,我采用完全相同的方法,并尝试通过
private void OnResourceCultureCollectionChanged(object sender,
ResourceCulturesCollectionChangedEventArgs e)
{
Resources.Clear();
foreach (var rvm in e.NewResourceCollection.Select(r => new ResourceViewModel(r)).ToList())
Resources.Add(rvm);
}
其中事件参数保存更新的基础
资源
s。现在我已经检查了数据,它是正确的-正在添加列,但是DataGrid
没有显示新列我做错了什么?在添加需要重新绘制数据网格的列时,请重置数据网格。ItemSource
应该会这样做
视图:
视图模型:
public class ViewModel : INotifyPropertyChanged
{
private bool _isResetingColumns;
public bool IsResetingColumns
{
get
{
return _isResetingColumns;
}
set
{
if (_isResetingColumns == value)
return;
_isResetingColumns = value;
OnPropertyChanged("IsResetingColumns");
}
}
private void OnResourceCultureCollectionChanged(object sender,
ResourceCulturesCollectionChangedEventArgs e)
{
//VIEWMODEL IS SETTING THIS TO TRUE BEFORE RESETTING `RESOURCES`
IsResetingColumns = true;
Resources.Clear();
foreach (var rvm in e.NewResourceCollection.Select(r => new ResourceViewModel(r)).ToList())
Resources.Add(rvm);
//VIEW'S LISTENING TO THIS PROPERTY CHANGED (naming could be better, or an event ,but the gist is there)
IsResetingColumns = false;
}
我不知道,它是否有用,但请尝试设置
AutoGenerateColumns=“True”
。我不能,我正在使用一个特殊的网格绑定,这意味着我必须“手动”创建列。谢谢您的时间。@Killercam,我刚刚想到了这一点,您是否尝试过在OnResourceCultureCollectionChanged
中将资源设置为空,然后创建一个新列表,然后添加(rvm)?想知道这是否会重置ItemSource并强制datagrid重新绘制。我怀疑,但值得一试……它不值得。我最近发现这个链接非常值得一读,并解释了为什么这不可能发生……不,我不能这样做。这是一个MVVM应用程序-我无法直接访问DataGrid
(尽管我非常想!)。感谢您的帮助。那么为什么不在ViewModel中添加一个事件,然后在视图中收听该事件,然后更新视图.DataGrid.ItemsSource
?因为它会破坏MVVM模式!抱歉,我不是想把它变成一个论坛,但它是如何打破MVVM的?ViewModel可以自由地发出有关其状态的信号,尽管它是属性或事件。视图以相同的方式注入ViewModel,并侦听ViewModel中发生的情况并做出相应的反应。在这种情况下,它知道这种变化非常剧烈,以至于它不得不重新绑定它的数据网格。在任何情况下,希望您找到您认为更合适的解决方案。很抱歉回复太晚。ViewModel不应直接访问任何视图组件。如果我决定将我的DataGrid
切换为ListView
或自定义DataGrid
,则会中断MVVM。我知道这可能被认为是迂腐的,但我想在这里严格遵守MVVM。此外,还不清楚如何直接从ViewModel访问DataGrid
实例。再次感谢您抽出时间。
public class ViewModel : INotifyPropertyChanged
{
private bool _isResetingColumns;
public bool IsResetingColumns
{
get
{
return _isResetingColumns;
}
set
{
if (_isResetingColumns == value)
return;
_isResetingColumns = value;
OnPropertyChanged("IsResetingColumns");
}
}
private void OnResourceCultureCollectionChanged(object sender,
ResourceCulturesCollectionChangedEventArgs e)
{
//VIEWMODEL IS SETTING THIS TO TRUE BEFORE RESETTING `RESOURCES`
IsResetingColumns = true;
Resources.Clear();
foreach (var rvm in e.NewResourceCollection.Select(r => new ResourceViewModel(r)).ToList())
Resources.Add(rvm);
//VIEW'S LISTENING TO THIS PROPERTY CHANGED (naming could be better, or an event ,but the gist is there)
IsResetingColumns = false;
}