Почему бы не переопределить свойство DataContext в WPF, если вызывается база - PullRequest
3 голосов
/ 04 августа 2011

В коде файла XAML, если мой DataContext всегда будет хорошо известным классом, я обычно повторно объявляю DataContext следующим образом:

public new Cow DataContext
{
    get { return base.DataContext as Cow; }
    set { base.DataContext = value; }
}

Таким образом, Intellisense рассматривает DataContext как корову вобласть моего файла, и я благополучно (по крайней мере, мне так кажется) использую base.DataContext для обработки всей его логики .

Некоторые люди с большим опытом уже сказали мнечто это не очень хорошая модель.

Я хотел бы знать, какие проблемы могут возникнуть, и почему бы не использовать их.Я уже много думал об этом и не мог вспомнить ни одного

Спасибо

Ответы [ 2 ]

4 голосов
/ 04 августа 2011

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

Допустим, ваш Xaml принадлежит классу с именем MyUserControl и что он наследуетиз UserControl.

Предположим, что у вас есть:

UserControl ctrl = new MyUserControl();
ctrl.DataContext = new Dog();

Это, очевидно, допустимо, и вы не защищены типобезопасностью MyUserControl, потому что типом ссылочной переменной является UserControl, чей типСвойство DataContext по-прежнему имеет тип объекта.Тем не менее, давайте представим себе, что происходит, попробуйте следующее в контексте MyUserControl:

Cow c = this.DataContext;

c будет нулевым.Это то, что вы хотели.Однако в сценарии отладки это может усложнить вашу жизнь, поскольку вы склоняетесь к мысли, что ваш DataContext является нулевым, а просто не тем, что вы ожидали.Возможно, будет сложнее понять, почему все ваши привязки данных работают забавно, в то время как ваш datacontext кажется нулевым.

Мой подход к этому не в том, чтобы скрыть свойство DataContext, а в том, чтобы повторно открыть его через новое свойство.:

public Cow Model
{
    get
    {
        return this.DataContext as Cow;
    }
    set
    {
        this.DataContext = value;
    }
}

В сценарии, который я настроил выше, хотя свойство Model будет возвращать ноль, DataContext будет возвращать ссылку на экземпляр Dog, более адекватно отражая то, что на самом деле происходит.В качестве альтернативы вы можете реализовать метод получения вашего свойства DataContext, возвращая следующее:

return (Cow)this.DataContext;

По крайней мере, вы получите исключение, сообщающее, что в DataContext есть что-то, но не то, что вы хотите.Однако это выглядит глупо.

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

0 голосов
/ 04 августа 2011

Ну, я не наблюдаю никаких проблем с этим, и это помогает только с IntelliSense ... оно не меняет свойство зависимости DataContext на Cow в любом случае ... так что нет никакой безопасности типов в том, что касается функций WPF, таких как Binding или Styles.

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