如何从基础 xaml“继承”

用户10835502

我有一个PageViewModelBase孩子需要实现 3 种方法并且一切都按预期工作的地方,因此,我想创建PageViewBase并让它的孩子实现两个简单的非通用事物(即:数据上下文绑定和数据网格列)。

我遇到了这篇文章并尝试相应地创建基础 xaml(下面的代码),但尽管我采用了不同的方法,但我无法创建子视图。我曾尝试<baseView:PageViewBase>成为 xaml 中唯一的元素并将其嵌入到另一个 UserControl 中,但这两种方法都失败了。

基本视图(省略了大量噪声代码,添加了子视图必须实现以进行可视化的示例部分):

<UserControl x:Class="WPFapp.Views.Base.PageViewBase">
    <UserControl.Resources>
        <!--<DataTemplate DataType="{x:Type localVM:HardwareViewModel}">
            <local:HardwareView/>
        </DataTemplate>-->
        <localHelpers:DateTimeConverter x:Key="dateTimeConverter" />
        <localHelpers:StatusColorConverter x:Key="statusColorConverter" />
    </UserControl.Resources>
    <UserControl.InputBindings> </UserControl.InputBindings>
    <Grid Margin="10">
        <Grid.RowDefinitions>
            <RowDefinition Height="1*" MinHeight="25" />
            <RowDefinition Height="15*" />
        </Grid.RowDefinitions>
        <ToolBarPanel Grid.Row="0" Orientation="Horizontal">
        </ToolBarPanel>

        <DataGrid ItemsSource="{Binding ItemsList}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" Grid.Row="1" AutoGenerateColumns="False" SelectionMode="Single">
            <DataGrid.ContextMenu> </DataGrid.ContextMenu>
            <DataGrid.InputBindings> </DataGrid.InputBindings>
            <DataGrid.Resources> </DataGrid.Resources>
            <DataGrid.RowStyle> </DataGrid.RowStyle>
            <ContentPresenter ContentSource="Content"/>
            <!--<DataGrid.Columns>
                <DataGridTextColumn Header="LastModifiedBy" Binding="{Binding LastModifiedBy}" />
            </DataGrid.Columns>-->
        </DataGrid>
    </Grid>
</UserControl>

子视图:

<UserControl x:Class="WPFapp.Views.HardwareView">
    <UserControl.Resources>
        <DataTemplate DataType="{x:Type localVM:HardwareViewModel}">
            <local:HardwareView/>
        </DataTemplate>
    </UserControl.Resources>
    <baseView:PageViewBase>
        <DataGrid>
            <DataGrid.Columns>
                <DataGridTextColumn Header="Id" Binding="{Binding Id}" />
                <DataGridTextColumn Header="Type" Binding="{Binding Type}" />
                <DataGridTextColumn Header="Label" Binding="{Binding Label}" />
                <DataGridTextColumn Header="Description" Binding="{Binding Description}" />
                <DataGridTextColumn Header="LastModifiedBy" Binding="{Binding LastModifiedBy}" />
                <DataGridTextColumn Header="LastModifiedAt" Binding="{Binding LastModifiedAt, Converter={StaticResource dateTimeConverter}}" />
            </DataGrid.Columns>
        </DataGrid>
    </baseView:PageViewBase>
</UserControl>

上面的孩子的 xaml 代码是迄今为止我管理的最好的代码,但它最终只显示列(例如,没有来自基础的工具栏)并且它UserControl.Resources从基础视图看不到我如何使它工作?

红咖喱

这是一个使用代码隐藏将正确的列动态添加到DataGrid. 您只需要PageViewBase视图,因此您可能想要重命名它,因为它不会成为任何东西的“基础”。

在 中UserControl.Resources,添加DataGrid您可以在所有不同模型中拥有的所有可能的列。例如,

<UserControl.Resources>
    <!-- Converters -->
    <localHelpers:DateTimeConverter x:Key="dateTimeConverter" />
    <localHelpers:StatusColorConverter x:Key="statusColorConverter" />

    <!-- DataGrid Columns -->
    <DataGridTextColumn x:Key="IdColumn" Header="Id" Binding="{Binding Id}" />
    <DataGridTextColumn x:Key="TypeColumn" Header="Type" Binding="{Binding Type}" />
    <DataGridTextColumn x:Key="LabelColumn" Header="Number" Binding="{Binding Label}" />
    <DataGridTextColumn x:Key="LastModifiedColumn" Header="LastModifiedAt" Binding="{Binding LastModifiedAt, Converter={StaticResource dateTimeConverter}}" />
    <!-- More column definitions go here for all model types -->
</UserControl.Resources>

确保将列放在转换器之后,以便您可以在数据绑定中使用它们。现在,修改DataGrid以便它在加载时运行代码隐藏。另外,删除ContentPresenter

<DataGrid
    ItemsSource="{Binding ItemsList}"
    SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
    Grid.Row="1"
    AutoGenerateColumns="False"
    SelectionMode="Single"
    Loaded="DataGrid_OnLoaded"
    >
    <DataGrid.ContextMenu> </DataGrid.ContextMenu>
    <DataGrid.InputBindings> </DataGrid.InputBindings>
    <DataGrid.Resources> </DataGrid.Resources>
    <DataGrid.RowStyle> </DataGrid.RowStyle>
    <!-- Columns are loaded in code-behind -->
</DataGrid>

在代码隐藏中,DataGrid根据绑定到特定视图的视图模型类型(通过视图的 获得DataContext添加正确的

private void DataGrid_OnLoaded(object sender, RoutedEventArgs e)
{
    if (sender is DataGrid dataGrid)
    {
        if (DataContext is HardwareViewModel)
        {
            dataGrid.Columns.Add(Resources["IdColumn"] as DataGridColumn);
            dataGrid.Columns.Add(Resources["TypeColumn"] as DataGridColumn);
            // More columns added here
        }
        else if (DataContext is AnotherHardwareViewModel)
        {
            dataGrid.Columns.Add(Resources["IdColumn"] as DataGridColumn);
            dataGrid.Columns.Add(Resources["LabelColumn"] as DataGridColumn);
            dataGrid.Columns.Add(Resources["LastModifiedColumn"] as DataGridColumn);
            // More columns added here
        }
    }
}

最后,创建者PageViewBase需要将其绑定到所需的特定类型的所需视图模型。例如,

<StackPanel>
    <local:PageViewBase DataContext="{Binding HardwareViewModel}" />
    <local:PageViewBase DataContext="{Binding AnotherHardwareViewModel}" />
</StackPanel>

我已经针对一个简单的案例测试了这个解决方案,并且我在两个DataGrids 中正确地得到了不同的列集但是,我还没有在更复杂的情况下尝试过这个,所以如果它不能解决您的具体问题,我提前道歉。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在WPF / XAML中反映类的继承?

来自分类Dev

android继承活动(基础-主要活动)

来自分类Dev

如何“继承” UNIQUE属性?

来自分类Dev

扩展通用基础:Diamond继承与QObject

来自分类Dev

如何修复继承的模型?

来自分类Dev

基础:无法在XAML中引用静态成员

来自分类Dev

Swift:如何继承UIButton?

来自分类Dev

我如何继承DataGridColumns

来自分类Dev

如何通过继承扩展django抽象基础模型?

来自分类Dev

如何从GObject类继承?

来自分类Dev

如何继承功能选项

来自分类Dev

如何在虚拟继承中构建直接基础?

来自分类Dev

传递具有继承对象值的基础对象(Json)

来自分类Dev

UWP / XAML:如何使用BasedOn从默认样式继承?

来自分类Dev

从基础组件继承的angular 2

来自分类Dev

Ruby:列出未从其基础继承的对象的实例变量

来自分类Dev

继承期间无法访问的基础

来自分类Dev

如何使用从.xaml中的TabControl继承的类?

来自分类Dev

Python继承-如何继承类函数?

来自分类Dev

如何在WPF / XAML中反映类的继承?

来自分类Dev

如何概述“继承:继承0”?

来自分类Dev

android继承活动(基础-主要活动)

来自分类Dev

WPF窗口/用户控件继承XAML

来自分类Dev

WPF数据绑定与继承-绑定到基础属性

来自分类Dev

如何确定从类模板继承的模板参数的基础模板类型?

来自分类Dev

使用基础模型的值初始化从基础模型继承的视图模型

来自分类Dev

WPF:午餐时纯 XAML 绑定条件的故事板基础

来自分类Dev

如何在 xaml 中继承用 C# 编写的自定义控件

来自分类Dev

为什么我的 conda 环境继承了所有基础包?