首页 > 解决方案 > 如何在 Button 命令 wpf 中将数据填充到数据网格中?

问题描述

我正在开发一个遵循 WPF MVVM 模式的应用程序,当按钮单击事件时,我需要用数据填充数据网格。所以我与网格相关的视图模型也填充了数据,但它没有出现在屏幕的网格中。我在这里做错了什么?任何建议将不胜感激。

作者模型类

public class Author
    {
        private int id;
        private string name;
        private string bookTitle;
        private bool isMVP;
        public Author(int ID, string Name, string BookTitle, bool IsMVP)
        {
            this.id = ID;
            this.name = Name;
            this.bookTitle = BookTitle;
            this.isMVP = IsMVP;
        }
        public int ID
        {
            get { return id; }
            set { id = value; }
        }
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public string BookTitle
        {
            get { return bookTitle; }
            set { bookTitle = value; }
        }
        public bool IsMVP
        {
            get { return isMVP; }
            set { isMVP = value; }
        }
    }

作者视图模型

public class AuthorViewModel: ObservableCollection<Author>
    {
        public AuthorViewModel():base()
        {
            Add(new Author
            (
                1,
            "Cather",
                 "Graphics Programming",
                true
            ));
           Add(new Author
            (
              2,
                "Mathew Cochran",
                 "LINQ in Vista",
                 true
            ));
            Add(new Author
            (
                 3,
                 "Mike Gold",
                 "Programming in Vista",
                true
            ));

        }
    }

主窗口视图模型

public class MainWindowViewModel
    {
        public ICommand LoadGridCommand { get; set; }

        public MainWindowViewModel()
        {
            LoadGridCommand = new RelayCommand(LoadGrid,null);
        }

        private void LoadGrid(object parameter)
        {
            AuthorViewModel authorVM = new AuthorViewModel();

        }
    }

主窗口.xaml

<Window x:Class="CustomCtrldemo.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:CustomCtrldemo"
        xmlns:vm="clr-namespace:CustomCtrldemo.ViewModels"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <vm:MainWindowViewModel x:Key="MainWindowVM"/>
        <vm:AuthorViewModel x:Key="AuthorVM"/>
    </Window.Resources>

    <Grid DataContext="{Binding Source={StaticResource MainWindowVM }}">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <TextBox Name="TxtFilterGrid" Grid.Row="0" Grid.Column="0" Width="100" Height="20"  />
        <Button Grid.Row="1" Grid.Column="0" Content="Load Grid"  Width="100" Height="20" Command="{Binding LoadGridCommand}" />
        <Grid x:Name="gridAuthors" Grid.Column="1" Grid.RowSpan="4" DataContext="{Binding Source={StaticResource AuthorVM} }" >
            <DataGrid x:Name="dgAuthors"  AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="ID" Binding="{Binding Path=ID}" />
                    <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" />
                    <DataGridTextColumn Header="Book Title" Binding="{Binding  Path=BookTitle}" />
                    <DataGridCheckBoxColumn Header="MVP Enabled" Binding="{Binding  Path=IsMVP}"/>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
        <Button Grid.Row="2" Grid.Column="0" Content="Load Control"  Width="100" Height="20"/>
        <Button Grid.Row="3" Grid.Column="0" Content="Set Content"  Width="100" Height="20"/>
        <TextBox Name="txtbox1" Grid.Row="4" Grid.Column="0" Width="100" Height="20" />
        <TextBox Name="txtUniqueId" Grid.Row="4" Grid.Column="1" Width="100" Height="20"/>
        <local:LoadControl />
        <WrapPanel HorizontalAlignment="center" Grid.Row="6" Grid.Column="1" >
            <Button Content="OK"  Width="100" Height="20"/>

            <Button  Content="Cancel"  Width="100" Height="20"/>
        </WrapPanel>
    </Grid>
</Window>

标签: c#wpf

解决方案


你的分开AuthorViewModel没有意义。相反,您应该Authors在主视图模型中有一个属性:

public class MainWindowViewModel
{
    public ICommand LoadGridCommand { get; }

    public ObservableCollection<Author> Authors { get; }
        = new ObservableCollection<Author>();

    public MainWindowViewModel()
    {
        LoadGridCommand = new RelayCommand(LoadGrid, null);
    }

    private void LoadGrid(object parameter)
    {
        // Authors.Clear();
        // Authors.Add(...);
    }
}

您应该将主视图模型的实例分配给窗口的 DataContext 并像这样绑定:

<Window.DataContext>
    <vm:MainWindowViewModel/>
</Window.DataContext>

<DataGrid ItemsSource="{Binding Authors}" ...>

推荐阅读