[英]How to set DataBinding for UserControl with ViewModel
我有一個usercontrol里面有幾個控件。 所以我決定使用ViewModel來管理所有那些可綁定的值。 但我發現我的綁定始終為空。 那么如何在usercontrol中為ViewModel設置綁定
MainWindows.xaml
<Window x:Class="Test.MainWindow"
Title="MainWindow" Height="450" Width="800">
<StackPanel>
<cus:Wizard WizardModel="{Binding MyModel}"/>
</StackPanel>
</Window>
MainWindows.xaml.cs
public partial class MainWindow : Window
{
private ViewModel vm = new ViewModel();
public MainWindow()
{
InitializeComponent();
DataContext = vm;
}
}
ViewModel.cs(MainWindow viewmodel)
public class ViewModel : INotifyPropertyChanged
{
private Model _MyModel;
public Model MyModel
{
get
{
return _MyModel;
}
set
{
_MyModel = value;
NotifyPropertyChanged("MyModel");
}
}
}
Wizard.xaml(我的UserControl)
<UserControl mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Something}" />
</Grid>
</UserControl>
Wizard.xaml.cs
public partial class Wizard : UserControl
{
private readonly object modelLock = new object();
private Model CurrentModel = new Model();
public Wizard()
{
InitializeComponent();
DataContext = CurrentModel;
}
public Model WizardModel
{
get { return (Model)this.GetValue(WizardModelProperty); }
set { this.SetValue(WizardModelProperty, value); }
}
public static readonly DependencyProperty WizardModelProperty = DependencyProperty.Register("WizardModel", typeof(Model), typeof(Wizard), new PropertyMetadata(null, new PropertyChangedCallback(ModelChanged)));
private static void ModelChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((Wizard)d).OnModelChanged();
}
private void OnModelChanged()
{
lock (this.modelLock)
{
if(CurrentModel != null)
{
CurrentModel = null;
}
if (WizardModel != null)
{
CurrentModel = WizardModel;
}
}
}
}
UserControl中的WizardModel始終為null。 那么如何在UserControl中設置這個ViewModel
應該在特定視圖模型類上操作的UserControl - 或者更確切地說,在具有特定公共屬性集的類上操作 - 可以直接綁定到其XAML中的視圖模型屬性。
鑒於一個視圖模型
public class Model
{
public string Something { get; set; }
}
你可以寫一個只有這個XAML的UserControl
<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仍然依賴於其DataContext中存在Something
屬性。 為了擺脫這種依賴性,你的控件可能會暴露一個依賴屬性
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}"/>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.