1.
Я бы сказал, что это зависит от типа UserControl, если он «универсальный», вы должны иметь возможность изменять DataContext, поскольку внутренний элемент управления не должен иметь ничего общего с DataContext. Например, если я создаю ImageButton
UserControl, который предоставляет свойства Caption
и ImageSource
, то они должны быть связаны внутренне независимо от DataContext, в этом случае они могут быть связаны, а также может быть изменен DataContext, например
<uc:ImageButton Caption="{Binding ButtonInfo.Caption}"
ImageSource="{Binding ButtonInfo.Image}"/>
Здесь можно изменить DataContext, чтобы немного упростить привязки:
<uc:ImageButton DataContext="{Binding ButtonInfo}"
Caption="{Binding Caption}"
ImageSource="{Binding Image}"/>
Если, с другой стороны, UserControl является представлением для модели представления, я бы ожидал, что UserControl будет привязывать к свойствам представления внутренне, относительно DataContext.
Таким образом, в DataTemplate, где текущий DataContext уже является моделью представления этого представления, простой экземпляр, который ничего не должен делать, т.е.
<v:StatisticsView />
Если передаваемая модель просмотра находится в свойстве текущего DataContext, вы можете также связать DataContext:
<v:StatisticsView DataContext="{Binding StatisticsViewModel}"/>
2.
Я могу сказать, что это может быть выполнено любым способом, особенно если у вас есть только три свойства, их создание не слишком сложное. Возможно, вы захотите рассмотреть некоторые аспекты, такие как зависимость, например, имеет ли смысл группировать все три свойства в объекте?
3.
Как отмечено в 1. Это должно быть видно из самого UserControl, если это StatisticsView
, то потребитель должен передать StatisticsViewModel
(либо неявно, наследуя текущий DataContext, либо явно связав его).