如何从文件加载表并允许编辑和保存(WPF)

xam8gpfp  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(150)

我是C#/.NET的新手,我正在使用MVVM parardigm开发一个WPF应用程序。主窗口有几个选项卡,在其中一个选项卡项中,我希望嵌入一个可以通过阅读XML文件来加载的表。XML文件包含有关仪器的数据。阅读相关内容后,看起来DataGrid就是我想要的构造。2下面是我插入到MainWindow.xaml文件中的特定选项卡中的dataGrid的代码:

<TabItem Header="Device Info" Width="100" Height="25">
            <DataGrid Name="DeviceInfoGrid" ItemsSource="{Binding}" AlternatingRowBackground="LightBlue" AlternationCount="2">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Alias" Binding="{Binding Alias}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Interface Type" Binding="{Binding InterfaceType}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Resource ID" Binding="{Binding VisaResource}"></DataGridTextColumn>
                    <DataGridTextColumn Header="MFG" Binding="{Binding Make}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Model" Binding="{Binding Model}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Cal Date" Binding="{Binding CalDate}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Cal Due Date" Binding="{Binding CalDueDate}"></DataGridTextColumn>
                </DataGrid.Columns>
                
            </DataGrid>

        </TabItem>

现在,我相信在我的MainWindow.xaml.cs(视图模型?)中,这就是我想要定义数据网格的数据上下文的地方?Microsoft示例建议我应该将DataGrid绑定到DataTable,DataTable由一些可以从XML文件读取的函数填充。
基本上,我希望此选项卡在打开时读取XML文件并根据XML中的信息填充数据网格的行。如果文件中有“Alias”元素,然后读取该元素并将其存储在“别名”列下的下一可用行中。然后,我希望允许用户编辑DataGrid中显示的内容,并在退出该选项卡后自动保存对XML文件的任何更改。
这里涉及了许多关于MVVM和.NET中提供的各种类的概念(网格,表格等),我努力在我的脑海中连接,看看它是如何走到一起的。我会感谢任何指针。你不必进入实现的本质,但如果你能概述一下我所需要的主要组成部分,让我知道我是否走在正确的道路上,那就太好了。
谢谢

cclgggtu

cclgggtu1#

一开始,你会误解很多基本的MVVM概念。有很多很好的资源供你学习。你可以使用下面的资源作为你将来研究WPF和MVVM的基础:
1.
我相信在我的MainWindow.xaml.cs(视图模型?)
这是您的代码隐藏,而不是您的VM。任何以“. xaml.cs”结尾的内容都是相关xaml文件的代码隐藏。. xaml.cs和.xaml文件的组合构成MVVM中的V(视图)。
2.
这就是我想要定义数据网格的数据上下文的地方
我们离VM越来越近了,有几种定义数据上下文的方法,但是通常在XAML中定义,因为这样可以方便地绑定到视图模型中的视图模型参数。
3.
读取XML文件并根据XML中的信息填充数据网格的行
我个人用视图模型工厂和数据提供程序来处理这个问题。这是一个相当广泛的主题,有许多可接受的解决方案,所以为了这个回应的目的,我将忽略回答这个问题,因为它有点超出了这些基本MVVM概念的范围。相反,我们可以称之为MVVM的M(模型)层。但是,我省略了我们如何读写数据。
4.
MVVM和.NET中提供的各种类(网格、表格等)
现在忘掉这些,只关注基本的东西。

为您介绍基本MVVM

  • 注意:MVVM社区工具包简化了很多这方面的工作。这不是使用工具包,因为首先了解绝对的基础知识是有益的 *

您将定义3个视图模型。请记住,您的视图模型需要INotifyPropertyChanged

public class MainViewModel : INotifyPropertyChanged
{
    private DataGridViewModel dataGridVM;

    public DataGridViewModel DataGridVM 
    { 
        public event PropertyChangedEventHandler? PropertyChanged;

        get => dataGridVM;
        set
        {
            dataGridVM = value;
            PropertyChanged?.Invoke(this, new ProperyChangedEventArgs(nameof(DataGridVM)));
        }
    }
}

public class DataGridViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler? PropertyChanged;

    public ObservableCollection<DataGridRowViewModel> DataGridRows { get; set; }
}

public class DataGridRowViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler? PropertyChanged;

    private string alias;
    public string Alias
    {
        get => alias;
        set 
        { 
            alias = value;
            PropertyChanged?.Invoke(this, new ProperyChangedEventArgs(nameof(Alias))); 
        }
    }
    
    //Continue with the rest of your parameters...
    
}

然后在.xaml视图中:
主视图:

<Window>
    <!--I am ommitting all the namespace declarations and such-->
    <namespace:MyGridView DataContext = "{Binding DataGridVM}"/>
</Window>

我的网格视图:

<MyGridView>
    <!--I am ommitting all the namespace declarations-->
    <DataGrid ItemsSource = "{Binding DataGridRows}">
     <DataGrid.Columns>
                    <DataGridTextColumn Header="Alias" Binding="{Binding Alias}"></DataGridTextColumn>
                    <!--Then continue with the rest of your columns, bound to the parameters-->
    </DataGrid>

</MyGridView>

有一件事我没有解释清楚:

  • MainWindow的数据上下文需要在App.xaml.cs中定义沿着创建视图模型(代替其他对象初始化架构模式)。这将很快分支到其他应用程序架构样式。

祝你好运

相关问题