Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为添加的行更新DataGrid,但不为添加的列更新DataGrid_C#_Wpf_Data Binding_Mvvm_Datagrid - Fatal编程技术网

C# 为添加的行更新DataGrid,但不为添加的列更新DataGrid

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

我有一个MVVM应用程序,它的数据绑定到
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;
    }