2013-09-16 3 views
0

Я пытаюсь реализовать следующее решение: https://stackoverflow.com/a/1486481/154439. В авторе solution он пишет:Наследование из окна в WPF MVVM

Я создал абстрактный класс ApplicationWindowBase, который наследуется от Window.

Я не уверен, что он здесь означает. Я попытался сменить свой XAML с <Window ... на <ApplicationWindowBase .... Не повезло.

Созданный конструктором файл для окна наследует от System.Windows.Window, но поскольку этот файл генерируется конструктором, внесение изменений в него не делает мне ничего хорошего. Я пробовал различные другие подходы без успеха.

Я очень знаком с WPF и MVVM. Мне что-то не хватает?

+3

Вам нужно наследовать код позади и t он xaml из вашего базового класса. Для этого в xaml вам также понадобится ссылка на пространство имен/двоичный класс, в котором находится класс, прежде чем он позволит вам его объявить. Синтаксис - это что-то вроде 'xmlns myPrefix = pathtoclass', а затем' ' –

ответ

1

кода, чтобы идти вместе с комментарием Кевина:

Кода За

/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : ApplicationWindowBase 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 
} 

XAML

<myPrefix:ApplicationWindowBase x:Class="StackOverflow.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:myPrefix="clr-namespace:StackOverflow" 
     Title="TestWindow" Height="300" Width="300"> 
    <Grid> 

    </Grid> 
</myPrefix:ApplicationWindowBase> 

Просто убедитесь, что вы используете правильные имена, мой случается Переполнение стека.

+0

Похоже, что для моих целей мне не нужно MainWindow для наследования из ApplicationWindowBase в коде позади. Секции XAML вашего ответа было достаточно, чтобы заставить меня двигаться. Благодарю. – mwolfe02

+0

Рад, что я мог бы помочь;) – TrueEddie

+0

@TrueEddie: Что, ты не редактировал ниндзя? И это подразумевается в вашей голове, а не в моем комментарии :) – Will

1

Во-первых, xaml или нет, это все классы. Поэтому все, что наследуется от другого класса (то есть Window), должно делать это как любой другой класс.

namespace SomeNamespace 
{ 
    public sealed class MyWindow : Window 
    { 
     public object SomeNewProperty {get;set;} 
    } 
} 

xaml - это совсем другой тип сериализации с собственным набором правил. Но он по-прежнему сериализован XML, и поэтому все должно быть прослеживаемо обратно к его оригинальному типу.

Как xaml делает это через объект в XML, называемый «пространства имен». Они хорошо согласуются с нашим пониманием пространств имен как разработчиков C#, поскольку мы должны сопоставить пространство имен XML в пространстве имен в нашем приложении, чтобы сериализатор xaml мог соответствовать элементу XML с CLR-типом.

Xaml использует несколько различных способов согласования этих пространств имен. Один выглядит как URL-адрес и определяется атрибутом сборки (например, «xmlns =» http://microsoft.com/whatevs »). Это работает, когда сборка является внешней по отношению к той, которую вы пишете. В вашем случае, вам придется использовать другой метод идентификации вашего пространства имен. Это специализированное пространство имен XML анализируется сериализатором xaml для идентификации пространства имен и содержит сборку ваших классов. Оно идет по форме «пространство имен clr: SomeNamespace; сборка .. = SomeAssembly»вы можете опустить немного сборки, если тип находится в текущей сборке

Чтобы поставить все эти вместе с приведенным выше примером, вы можете создать экземпляр вашего нового окна, как это:

<t:MyWindow 
    xmlns:t="clr-namespace:SomeNamespace" 
    xmlns="the standard microsoft namespace here" 
    t:OmitOtherStuffBecauseThisIsAnExampleLol="true"> 
Смежные вопросы