Подумав некоторое время об этом коде, я не могу найти ни одной серьезной проблемы, за исключением, возможно, этого углового случая, который я объясню.
Допустим, ваш 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 есть что-то, но не то, что вы хотите.Однако это выглядит глупо.
Во всяком случае, это действительно не серьезная проблема, а только возможное неудобство в сценарии, который я изложил.