微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Datagrid 保持 Empty 但 ObservableCollection 有值

如何解决Datagrid 保持 Empty 但 ObservableCollection 有值

目前我正在尝试学习 WPF,但是经过数小时的谷歌搜索并尝试自行修复后,我遇到了当前的问题。我正在尝试显示模型省份。我发现了多个类似的问题,但我无法自己解决。检查输出后,没有提到任何错误。目前,即使 Observable 集合被更新,窗口也只显示空模型但没有数据。所以在我完全摧毁我对 WPF 的兴趣之前,我寻求帮助。

我的视图

<Window x:Class="isnuaatest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:isnuaatest"
    xmlns:local1="clr-namespace:isnuaatest.Models"
    xmlns:local2="clr-namespace:isnuaatest.viewmodel"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
    <local2:MainWindowviewmodel/>
</Window.DataContext>
<Grid>
    <Grid>
        <DataGrid ItemsSource="{Binding Provinces,UpdateSourceTrigger=PropertyChanged}">
        </DataGrid>
    </Grid>
    <StackPanel Width="200" Margin="50">
        <Button x:Name="OpenSaveFile" Click="OpenSaveFile_Click">OpenSaveFile</Button>
    </StackPanel>
</Grid>

我的视图模型

using isnuaatest.Helper;
using isnuaatest.Models;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Input;

namespace isnuaatest.viewmodel
{
    public class MainWindowviewmodel : INotifyPropertyChanged
    {
        public ObservableCollection<Province> _province;
        public ObservableCollection<Province> Provinces
        {
            get { return this._province; }
            set
            {
                _province = value;
            }
        }
        public MainWindowviewmodel() : base()
        {
            this.Provinces = new ObservableCollection<Province>();
        }

        private string _savegamePath;
        public string SavegamePath
        {
            get { return _savegamePath; }
            set { _savegamePath = value; OnPropertyChanged("SavegamePath"); GetProvinces(_savegamePath);}
        }



        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            var savegamefile = this.PropertyChanged;
            if (savegamefile != null)
                savegamefile(this,new PropertyChangedEventArgs(propertyName));
        }
        public event EventHandler OnItemChanged;
        public void GetProvinces(string path)
        {
            Reader reader = new Reader();
            if (_savegamePath != null)
            {
                FileStream fs = File.OpenRead(path);
                List<Province> listofProvinces = reader.ReadTextString(fs);
                foreach (Province province in listofProvinces)
                {
                    Provinces.Add(new Province()
                    {
                        Aristocrats = province.Aristocrats,Artisans = province.Artisans
                    });
                }
            }
        }
    }
}

背后的代码

using isnuaatest.Helper;
using isnuaatest.Models;
using isnuaatest.viewmodel;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace isnuaatest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindowviewmodel _vm = new MainWindowviewmodel();
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new MainWindowviewmodel();
        }
        private void OpenSaveFile_Click(object sender,RoutedEventArgs e)
        {
            OpenFileDialog fileDialog = new OpenFileDialog();
            fileDialog.Multiselect = false;

            dynamic result = fileDialog.ShowDialog();

            if (result == true)
            {
                _vm.SavegamePath = fileDialog.FileName;
            }
        }
    }
}

我的想法是数据上下文可能不会更新,因为数据在 Observable 集合中。如果这是真的,我该如何更新数据上下文,我已经尝试将其添加到 xaml 中,但无济于事。

谢谢

解决方法

您实际上创建了 3 个不同的 MainWindowViewModel 对象 - 一个在 xaml 中,两个在隐藏的代码中。您可以在 xaml 中去掉一个,一旦在 MainWindow 构造函数中设置 DataContext xaml-one 被覆盖。
但是代码隐藏中的两个对象会导致您的问题 - 您将文件加载到 _vm 对象中,但它不是保存在 DataContext 中的那个。
要解决您的问题,请对 _vm 使用 DataContext 而不是新对象:

public MainWindowViewModel _vm = new MainWindowViewModel();
public MainWindow()
{
     InitializeComponent();
     DataContext = _vm;
}
,

更改您的省份:

public ObservableCollection<Province> Provinces
        {
            get { return this._province; }
            set
            {

                _province = value;
               OnPropertyChanged("Provinces");
            }
        }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。