我创建了一个自定义控件来测试绑定的工作原理。它有一个依赖属性,我想从另一个视图绑定它,并且我还希望在绑定属性使用 INotifyPropertyChanged 引发属性更改时更新它:
public string BindLabelText
{
get { return (string)GetValue(BindLabelTextProperty); }
set { SetValue(BindLabelTextProperty, value); }
}
public static readonly DependencyProperty BindLabelTextProperty =
DependencyProperty.Register("BindLabelText", typeof(string), typeof(BindingControl),
new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
在我的控制中,我像这样绑定依赖属性:
<TextBlock
Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"
Text="{Binding ElementName=TestControl, Path=BindLabelText, FallbackValue=BindLabelText}"
FontSize="20"/>
我像这样使用控制:
<local:BindingControl BindLabelText="Static main window value" />
<local:BindingControl BindLabelText="{Binding HeaderLabel, FallbackValue=HeaderLabel}" />
<Button Content="Change MainWindow property" Command="{Binding ChangeMainTextCommand}"/>
TextBlock 文本值是用静态值设置的,但当我尝试将其绑定到属性时它不起作用。在这两个视图中,我在代码隐藏中将 DataContext 设置为 ViewModel:
this.DataContext = new BindingControlViewModel();
编辑: 将我的代码添加到 github。就像我在评论中所说的那样,我正在尝试将MainWindowViewModel上的属性绑定到我的用户控件DP BindLabelText,这是我的父视图(MainWindow(的数据上下文。除了 DP 之外,用户控件也有自己的视图模型。我的目标是使用户控件在 MainWindowViewModel 的绑定属性更新时更新。
我设法通过将我的控件 DataContext 设置为网格(如MyGrid.DataContext = new BindingControlViewModel();
(而不是像this.DataContext = new BindingControlViewModel();
一样将其设置在控件本身上来解决它。