代码之家  ›  专栏  ›  技术社区  ›  Bob Kaufman

MVVM选项卡式界面面板似乎共享一个单一的公共资源

  •  0
  • Bob Kaufman  · 技术社区  · 6 年前

    我正在创建一个WPF标签界面实用程序使用mvvmlight。而独立的对话框则独立存在 .xaml DataTemplate MainWindow.xaml .

    DataGrid . 我想要的是在创建一个网格时调用一个事件处理程序,该网格将遍历列并对某些列执行一些自定义操作。所以我加了一个 Initialized 数据网格 数据网格 创建。。。或者当我关闭所有标签打开一个新的 数据网格 标签。再调查一下我就会发现 DataContextChanged 每当我创建后续网格或在选项卡之间单击时发生。

    我认为我犯了一个设计缺陷,虽然每个网格都有一个单独的视图模型,但只有一个单一的公共网格资源,但不确定如何纠正它。

    每个选项卡的网格?

    Sample View with several tabs open

    数据模板 主窗口.xaml :

    <Window...>
        <Window.Resources>
        <DataTemplate DataType="{x:Type vm:GridViewModel}">
            <Grid>
                <DataGrid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,32" RowHeight="{Binding RowHeight}" SelectionUnit="Cell" 
                          IsReadOnly="True" LoadingRow="DataGrid_LoadingRow" ItemsSource="{Binding RecordSet}" AutoGenerateColumns="false" 
                          Initialized="DataGrid_Initialized" DataContextChanged="DataGrid_DataContextChanged" >
    
                </DataGrid>
            </Grid>
        </DataTemplate>
        </Window.Resources>
    </Window>
    

    TabControl Grid

    <TabControl x:Name="DocumentArea" ItemsSource="{Binding Workspaces}" SelectedIndex="{Binding SelectedIndex}" HorizontalAlignment="Stretch" Margin="0,35,0,35" VerticalAlignment="Stretch">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <WrapPanel>
                    <TextBlock Text="{Binding Header}" />
                    <Button Command="{Binding CloseCommand}" Content="X" Margin="4,0,0,0" FontFamily="Courier New" Width="17" Height="17" VerticalContentAlignment="Center" />
                </WrapPanel>
            </DataTemplate>
        </TabControl.ItemTemplate>
    </TabControl>
    

    中的方法示例

    private void ShowAccountsGrid()
    {
        GridViewModel viewModel = new GridViewModel { Header = "QuickBooks Chart of Accounts" };
    
        Workspaces.Add(viewModel);
        SelectedIndex = Workspaces.IndexOf(viewModel);
        viewModel.RecordSet = _quickBooksHelper.AccountList;
    }
    

    相关代码来自 GridViewModel.cs :

    public class GridViewModel : WorkspaceViewModel
    {
        private readonly IDataService _dataService;
    
        public RelayCommand DoDeleteRow { get; set; }
        public RelayCommand DoShowRowDetail { get; set; }
    
        [PreferredConstructor]
        public GridViewModel(IDataService dataService) :base()
        {
            InitBoundFields();
    
            SetupRelayCommands();
            _dataService = dataService;
            _dataService.GetData(
                (item, error) =>
                {
                    if (error != null)
                    {
                        // Report error here
                        return;
                    }
                });
        }
    
    0 回复  |  直到 6 年前