UserControl, который должен работать с конкретным классом модели представления - или, точнее, с классом с определенным набором открытых свойств - может напрямую связываться со свойствами модели представления в своем XAML.
Учитываямодель представления, такую как
public class Model
{
public string Something { get; set; }
}
, вы можете написать UserControl, содержащий не более чем этот XAML
<UserControl ...>
...
<TextBox Text="{Binding Something}" />
...
</UserControl>
и этот код
public partial class Wizard : UserControl
{
public Wizard()
{
InitializeComponent();
}
}
Если вы сейчас установитеего DataContext для экземпляра Model
(или любого другого класса со свойством Something
), он будет просто работать:
<local:Wizard DataContext="{Binding MyModel}"/>
, так как значение свойства DataContext наследуется от родительских к дочерним элементамэто также будет работать:
<StackPanel DataContext="{Binding MyModel}">
<local:Wizard/>
</StackPanel>
Однако UserControl все еще зависит от существования свойства Something
в его DataContext.Чтобы избавиться от этой зависимости, ваш элемент управления может предоставить свойство зависимости
public static readonly DependencyProperty MyTextProperty =
DependencyProperty.Register(nameof(MyText), typeof(string), typeof(Wizard));
public string MyText
{
get { return (string)GetValue(MyTextProperty); }
set { SetValue(MyTextProperty, value); }
}
и связать элемент в его XAML с его собственным свойством
<UserControl ...>
...
<TextBox Text="{Binding MyText,
RelativeSource={RelativeSource AncestorType=UserControl}}"/>
...
</UserControl>
Теперь вы должны связатьсвойство элемента управления вместо установки его DataContext:
<local:Wizard MyText="{Binding MyModel.Something, Mode=TwoWay}"/>