WPF:不能访问视图.Datagrid不刷新选项卡中的数据

本文关键字:选项 数据 刷新 不能 访问 视图 Datagrid WPF | 更新日期: 2023-09-27 17:49:25

我遵循这个如何在WPF/c#中创建选项卡内容?但我希望每个标签显示一个数据网格。数据网格没有显示,也没有显示数据。当我进入代码时,我确实看到设置了0,1。

MainWindow.xaml

<Window x:Class="MVVMDataInstances.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:viewModel="clr-namespace:MVVMDataInstances"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <viewModel:MainWindowViewModel />
    </Window.DataContext>
    <Grid>
        <Grid.Resources>
            <DataTemplate x:Key="ContentTemplate" 
                      DataType="{x:Type viewModel:ChildViewModel}"/>
        </Grid.Resources>
        <TabControl ContentTemplate="{StaticResource ContentTemplate}"  
                ItemsSource="{Binding Items}" />
    </Grid>
</Window>

MainWindowViewModel.cs

 public ObservableCollection<ChildViewModel> Items { get; private set; }
        public MainWindowViewModel()
        {
            Items = new ObservableCollection<ChildViewModel> {new ChildViewModel(0), new ChildViewModel(1)};
        }

ChildView.xaml

<UserControl x:Class="MVVMDataInstances.View"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:ViewModel="clr-namespace:MVVMDataInstances"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.DataContext>
        <ViewModel:ChildViewModel/>
    </UserControl.DataContext>
            <DataGrid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding Grid, Mode=TwoWay}" />
</UserControl>

ChildViewModel.cs

public class ChildViewModel : ViewModelBase
    {
        private ObservableCollection<ChildModel> _grid;
        public ObservableCollection<ChildModel> Grid
        {
            get { return _grid; }
            private set
            {
                _grid = value;
                OnPropertyChanged("Grid");
            }
        }
        public ChildModel Data { get; set; }
        public ChildViewModel()
        {
        }
        public ChildViewModel(int tabNumber)
        {
            Data = new ChildModel {A = tabNumber.ToString(CultureInfo.InvariantCulture)};
            Grid = new ObservableCollection<ChildModel> {Data};
        }
    }

ChildModel.cs

public class ChildModel
    {
        public string A { get; set; }
        public string B { get; set; }
    }

ViewModelBase.cs

 public class ViewModelBase : INotifyPropertyChanged
    {
        public void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }

我想看到每个标签一个网格。对于属性a,第一个选项卡条目的值为0;对于属性b,第二个选项卡条目的值为1。

我看到当OnPropertyChanged被称为PropertyChanged是空的。

我可以访问数据网格如果我在mainwindow。xaml中有这个

<Grid>
        <TabControl ItemsSource="{Binding Items}">
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding TabTitle}"/>
                </DataTemplate>
            </TabControl.ItemTemplate>
            <TabControl.ContentTemplate>
                <DataTemplate>
                    <DataGrid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" AutoGenerateColumns="True"
                  ItemsSource="{Binding Grid}"/>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </Grid>

但是OnPropertyChanged对于这个总是null我看不到网格

<DataTemplate x:Key="ContentTemplate" 
                  DataType="{x:Type viewModel:ChildViewModel}">
     <viewModel:ChildView /> 
</DataTemplate>

WPF:不能访问视图.Datagrid不刷新选项卡中的数据

您的DataTemplate为空。根据您的问题,您可能希望按照以下方式执行操作:

<Grid>
    <Grid.Resources>
        <DataTemplate x:Key="ContentTemplate" TargetType="{x:Type viewModel:ChildViewModel}">
            <DataGrid AutoGenerateColumns="False" . . .>
                <DataGrid.Columns>
                    <!-- Your column definitions here -->
                </DataGrid.Columns>
            </DataGrid>
        </DataTemplate>
    </Grid.Resources>
    <TabControl ContentTemplate="{StaticResource ContentTemplate}"  
            ItemsSource="{Binding Items}" />
</Grid>

这个DataTemplate告诉ChildViewModel.cs它的外观是View。xaml:

 <DataTemplate x:Key="ContentTemplate" 
                  DataType="{x:Type viewModel:ChildViewModel}">
     <viewModel:View /> 
</DataTemplate>

因此在幕后它也设置每个视图的DataContext为ChildViewModel的一个实例。

我遵循这个MVVM: ViewModel继承有ViewModel继承。PropertyChanged的原因是空的,因为构造函数初始化了两次。第一次使用整数,第二次使用InitializedComponent。如果我注释掉InitializedComponent,网格就不会被初始化。对另一个stackoverflow问题的回答使视图模型继承变得更加清晰。