XAML 如何在wpf中使用泛型基类而不是window?

u4vypkhs  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(241)

我该怎么做?

public partial class MyWindow : View<MyViewModel>
{
}

其中视图定义为

public class View<T> : Window where T : IViewModel, new()
{
}

XAML文件:

<local:View
x:Class="Project.MyWindow"
x:TypeArguments="ViewModels:MyViewModel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
xmlns:ViewModels="clr-namespace:Mynamespace.ViewModels;assembly=Mynamespace.ViewModels"
xmlns:local="clr-namespace:Project"
>

我收到这个错误...名称View不存在于命名空间Project中...当然它存在。
我得到了这个错误,这真的让我很困惑...属性“TypeArguments”在“http://schemas.microsoft.com/winfx/2006/xaml“命名空间中不存在...当然它存在。
关于如何在wpf中使用泛型作为windows的基类,有什么线索吗?

egmofgnx

egmofgnx1#

这个问题的答案是永远不要在xaml中使用泛型。总有更好的方法或变通方法。请参见原帖的评论。
编辑!
多亏了Micky邓肯(见上面的评论),这个问题的正确答案可以通过调查这两个链接来找到:
http://msdn.microsoft.com/en-us/library/ms741843(v=vs.110).aspxhttp://www.codeproject.com/Articles/37317/Generic-Support-In-XAML显示器

dw1jzc5e

dw1jzc5e2#

这是一个古老的主题,但正如我来到周围和其他人可能:我不知道从什么时候开始,但在. net 6.0中测试
这种方法是正确的,但如果不知道提问者使用了哪些项目设置,就很难说出哪里出了问题。

  • 是的,我知道这很难看,但我必须承认这是一个概念原型的证明 *

示例XAML:

<base:ApplicationTabItem x:TypeArguments="entries:ArtikelEntry,vms:ArtikelTabViewModel"
    x:Class="S2_Management.DesktopApp.UIElements.AppTabs.ArtikelTab"
                    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:local="clr-namespace:S2_Management.DesktopApp.UIElements.AppTabs"
                    mc:Ignorable="d" 
                    xmlns:vms ="clr-namespace:S2_Management.DesktopApp.ViewModels"
                    xmlns:values="clr-namespace:S2_Management.CoreLib.ConstantValues;assembly=S2-Management.CoreLib"
                    xmlns:entries="clr-namespace:S2_Management.CoreLib.Tables;assembly=S2-Management.CoreLib"
                    xmlns:base="clr-namespace:S2_Management.DesktopApp.UIElements.Base"
                    d:DataContext="{d:DesignInstance Type=vms:ArtikelTabViewModel, IsDesignTimeCreatable=true}"
                    d:DesignHeight="450" d:DesignWidth="800"
                    >
    <TabItem.Header>
        <Label Content="{Binding FQ_TabName}"/>
    </TabItem.Header>
    <Grid KeyUp="OnKeyUp">
        <DataGrid ItemsSource="{Binding ItemListe}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" SelectedItem="{Binding SelectedItem}">
            <DataGrid.Resources>
                    <Style TargetType="DataGridRow">
                        <EventSetter Event="MouseDoubleClick" Handler="ItemDoubleClick"/>
                    </Style>
                </DataGrid.Resources>
            <DataGrid.Columns>
                <DataGridTextColumn Header="{x:Static values:ConstantValueStore.ArtikelTabGridBezeichnungTitle}" Binding="{Binding Artikel_Bezeichnung}" IsReadOnly="True" SortDirection="Ascending" />
                <DataGridTextColumn Header="{x:Static values:ConstantValueStore.ArtikelTabGridEinheitenTitle}" Binding="{Binding Einheit.Einheiten_Bezeichnung}" IsReadOnly="True"/>
                <DataGridTextColumn Header="{x:Static values:ConstantValueStore.ArtikelTabGridKategorieTitle}" Binding="{Binding ArtikelKategorie.ArtikelKategorien_Bezeichnung}" IsReadOnly="True"/>
                <DataGridTextColumn Header="{x:Static values:ConstantValueStore.ArtikelTabGridPreisGruppeTitle}" Binding="{Binding Preisgruppe.Preisgruppen_Bezeichnung}" IsReadOnly="True"/>

            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</base:ApplicationTabItem>

示例代码隐藏

namespace S2_Management.DesktopApp.UIElements.AppTabs
{
    /// <summary>
    /// logic for ArtikelTab.xaml
    /// </summary>
    public partial class ArtikelTab //: ApplicationTabItem<ArtikelEntry, ArtikelTabViewModel>
    {

        public ArtikelTab()
        {
            InitializeComponent();
            this.DataContext = _vm = getTabViewModel();
        }

    }
}

范例基底类别:

namespace S2_Management.DesktopApp.UIElements.Base
{
    public class ApplicationTabItem<ItemType, TVMType> : TabItem, IApplicationTabItem
        where TVMType : ITabViewModel<ItemType>, new()
    {
        protected TVMType? _vm;

        protected TVMType getTabViewModel()
        {
            return new TVMType() { OwnTabItem = this };
        }

        public virtual RibbonTab? GetRibbonTab()
        {
            return _vm?.GetRibbonTab();
        }

        protected void ItemDoubleClick(object sender, MouseButtonEventArgs? e)
        {
            _vm?.OpenSelectedItemFor(CRUDModus.Read);
        }

        protected void OnKeyUp(object sender, KeyEventArgs e)
        {
            if ((e.KeyboardDevice.Modifiers & ModifierKeys.Control) != 0)
            {
                switch (e.Key)
                {
                    case Key.D:
                        _vm?.CopyCommand?.Execute(null);
                        break;
                    case Key.N:
                        _vm?.CreateNewCommand?.Execute(null);
                        break;
                }
            }
            else
            {
                switch (e.Key)
                {
                    case Key.Escape:
                        if (_vm != null) _vm.SelectedItem = default;
                        break;
                    case Key.Enter:
                        ItemDoubleClick(this, null);
                        break;
                    case Key.Delete:
                    case Key.Back:
                        _vm?.DeleteCommand?.Execute(null);
                        break;
                }
            }
        }

    }
}

说明

public class ApplicationTabItem<ItemType, TVMType> : TabItem, IApplicationTabItem
        where TVMType : ITabViewModel<ItemType>, new()

这是从TabItem继承的超类。我们都应该知道:

TabItem

是一个UIElement,它提供了我们所需要的一切!

<base:ApplicationTabItem x:TypeArguments="entries:ArtikelEntry,vms:ArtikelTabViewModel"

是什么说的嘿请继承!

重要提示:

public partial class ArtikelTab //: ApplicationTabItem<ArtikelEntry, ArtikelTabViewModel>

原来我们也可以在代码后面继承,也就是:
1.多余的
1.不好的风格,因为你需要在两个地方改变东西
1.* * 但是:可读性更好、更快**
但到目前为止,有一个开放BUG:

    • 在[whatever]. xaml. g. s生成过程中,从代码隐藏文件中的泛型类型继承将失败。因此,请务必删除从代码隐藏文件中继承的泛型类型,或者至少将其添加到注解中!!!**

链接到有关该主题的MS博客页面,但支持处于非常早期的状态:https://learn.microsoft.com/en-us/archive/blogs/mikehillberg/limited-generics-support-in-xaml

相关问题