WPF Универсальный Windows - PullRequest
       13

WPF Универсальный Windows

6 голосов
/ 24 августа 2009

Я хочу сделать многоразовое окно WPF , подходящее для различных типов Т. У меня есть дизайнер и файл кода.

я могу сделать что-то подобное?

/*  Code behind file */
public partial class MyWindows<T> : Window
{}

Ответы [ 2 ]

6 голосов
/ 31 марта 2011

Бесстыдно скопировано с здесь (и, следовательно, не проверено)

public class ViewBase<T> : Window, IView where T : class, IViewModel 
{ 
    public virtual T Model 
    { 
        get { return DataContext as T; } 
        set { DataContext = value; } 
    } 
} 

и XAML

<src:ViewBase 
    x:Class="View" 
    x:TypeArguments="src:IViewModel" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:src="clr-namespace:MyNamespace" 
    Height="480" Width="640"> 
... 
</src:ViewBase> 
3 голосов
/ 24 августа 2009

К сожалению, то, что вы хотите, не вполне невозможно.

Обновление: До .NET 4.0 (т.е. когда этот ответ был изначально написан), Поддержка XAML для использования универсальных типов была очень ограниченной ; например дженерики работали только с корневым элементом. В .NET 4.0 некоторые ограничения были сняты.

В .NET 4.0 вы можете создать полностью специализированный универсальный тип. Таким образом, хотя сам XAML по-прежнему не имеет понятия универсальных типов, он может ссылаться на специализации универсальных типов. (По аналогии, XAML не может выразить понятие List<>, но может выразить понятие List<int>). Подробнее см. На странице MSDN «Общие сведения в XAML» .

Вы можете создавать экземпляры специализированных универсальных типов с помощью директивы x:TypeArguments . Например, если x привязано к пространству имен XAML, sys к пространству имен System и scg к System.Collections.Generic, а ваше собственное пространство имен MyWindows ограничено my, то:

  • <my:MyWindows x:TypeArguments="x:String"> создаст экземпляр MyWindows<string>.
  • <scg:List x:TypeArguments="sys:Tuple(sys:String,sys:Int32)"> построит List<Tuple<string,int>>

Поэтому использование универсальных типов больше не является проблемой в XAML!

Увы, вы хотите определить универсальный тип в XAML. Это невозможно. Здесь есть два обходных пути. Во-первых (и основываясь на ваших комментариях к другому вопросу, я думаю, это то, что вы хотите), вы можете просто передать тип в качестве простого параметра. Если вы сделаете это, вы потеряете все функции безопасности во время компиляции, которые предоставляют дженерики, но достаточно часто они не актуальны. Во-вторых, вы можете определить обычный неуниверсальный класс с codebehind в XAML и просто использовать универсальный базовый класс для повторного использования кода. Таким образом вы получите хоть какую-то надлежащую безопасность и повторное использование дженериков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...