【问题标题】:WPF: Can't access the view. Datagrid is not refreshing with data in tabsWPF:无法访问视图。 Datagrid 不刷新选项卡中的数据
【发布时间】:2014-03-10 18:08:14
【问题描述】:

我正在关注这个How to create tab-able content in 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 始终为空,我没有看到网格

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

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    您的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>
    

    【讨论】:

    • 这将设置标题,但不会为 MainWindowViewModel.cs 中指定的 Data 设置值 0,1
    【解决方案2】:

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

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

    因此,它还在幕后将每个 View 的 DataContext 设置为 ChildViewModel 的一个实例。

    【讨论】:

    • 我正在尝试使用stackoverflow.com/questions/9547461/… MainWindowViewModel.cs 中的示例确实创建了两个选项卡,但没有显示网格。我不知道如何使用 ContentPresenter。我会查查的。您提供的最后一个 sn-p 不起作用。
    • 我现在看到了数据网格的轮廓,但是当我单步执行代码时,属性更改始终为空。
    【解决方案3】:

    我遵循这个MVVM: ViewModel inheritance 来获得 ViewModel 继承。 PropertyChanged 为 null 的原因是构造函数被初始化了两次。第一次使用整数,然后第二次使用 InitializedComponent。如果我注释掉 InitializedComponent,则网格从未初始化。另一个 stackoverflow 问题的答案通过视图模型继承让一切变得更清晰。

    【讨论】:

      猜你喜欢
      • 2013-11-06
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      相关资源
      最近更新 更多