Установите свойства зависимостей в XAML, когда базовый класс является универсальным - PullRequest
5 голосов
/ 02 сентября 2010

Что касается заголовка, как можно установить свойство зависимости в XAML, когда базовый класс является универсальным? При попытке сделать это я получаю исключение NullReferenceException, установка свойства из кода работает нормально. Это также работает, когда базовый класс не является универсальным. Я использую .NET4

Вот пример кода для демонстрации:

WindowBase.cs

using System.Windows;

namespace GenericDependencyPropertyTest
{
    public class WindowBase<ViewModel> : Window
    {
        public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register(
        "Header", typeof(string), typeof(WindowBase<ViewModel>), new PropertyMetadata("No Header Name Assigned"));

        public string Header
        {
            get { return (string)GetValue(HeaderProperty); }
            protected set { SetValue(HeaderProperty, value); }
        }
        protected virtual ViewModel Model { get; set; }
    }
}

MainWindow.xaml

<local:WindowBase x:Class="GenericDependencyPropertyTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:GenericDependencyPropertyTest"
        x:TypeArguments="local:IMyViewModel"
        Title="MainWindow" Height="350" Width="525" Header="Test">
    <Grid>

    </Grid>
</local:WindowBase>

MainWindow.xaml.cs

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

        protected override IMyViewModel Model
        {
            get
            {
                return base.Model;
            }
            set
            {
                base.Model = value;
            }
        }
    }
}

IMyViewModel.cs

namespace GenericDependencyPropertyTest
{
    public interface IMyViewModel
    {
    }
}

1 Ответ

8 голосов
/ 13 сентября 2011

Я предполагаю, что проблема заключается в типе владельца свойства зависимостей (typeof (WindowBase ). Каждый закрытый универсальный тип будет совершенно другим типом среды выполнения, поэтому компилятор будет счастливчто свойство существует, среда выполнения WPF не может найти его, когда оно ищет свойство в сравнении с (другим) типом во внутреннем хранилище.

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

Вы можете получить желаемое поведение, переместив DP в неуниверсальную базу, но по-прежнему выводя ваши представления из универсального класса, чтобы получить строго типизированные модели

public class WindowBase : Window
{
    public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register(
        "Header", typeof(string), typeof(WindowBase), new PropertyMetadata("No Header Name Assigned"));

    public string Header
    {
        get { return (string)GetValue(HeaderProperty); }
        protected set { SetValue(HeaderProperty, value); }
    }
}

public class WindowBase<ViewModel> : WindowBase
{
    protected ViewModel Model { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...