根据msdn,将某些东西绑定到嵌套属性应该是完全合法的,也是可能的:
<Binding Path="propertyName.propertyName2" .../>
<Binding Path="propertyName.propertyName2.propertyName3" .../>
就我而言,情况并非如此......
我有一个自定义控件MyControl
,带有依赖项属性ViewModel
:
public static DependencyProperty ViewModelProperty = DependencyProperty.Register(
"ViewModel", typeof(IViewModel), typeof(MyControl));
public IViewModel ViewModel
{
get { return (IViewModel)GetValue(ViewModelProperty); }
set { SetValue(ViewModelProperty, value); }
}
在控件模板中,我尝试绑定到该viewmodel中的属性:
<Style TargetType="{x:Type my:MyControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type my:MyControl}">
<Grid>
<TextBox Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ViewModel.Text}"/>
<Button x:Name="MyButton" Content="Visible by trigger" Visibility="Collapsed" />
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ViewModel.ButtonVisible}" Value="True">
<Setter TargetName="MyButton" Property="Visibility" Value="Visible" />
</DataTrigger>
.../>
在viewmodel本身中,我有一个preoperty文本如下:
public string Text
{
get { return m_text; }
set
{
m_text = value;
OnPropertyChanged("Text");
}
}
public bool ButtonVisible
{
get { return m_buttonVisible; }
set
{
m_buttonVisible = value;
OnPropertyChanged("ButtonVisible"); }
}
我没有遇到绑定错误,但事情没有发生......
任何线索?
修改 它看起来像绑定工作的一半。在编辑框中更改文本时,我的Text属性已设置,但如果在代码中设置了Text-property,则ui将不会更新。
编辑2
看起来我在发布之前首次尝试简化案例有点成功......正如@Erno指出的那样,我发布的代码似乎工作正常。
我已经查看了原始代码,并为场景添加了一个触发器。原始代码使用触发器在给定条件下显示部分ui。这些也绑定到嵌套属性。我现在认为这些触发器无法触发。我已经更新了代码。如果它仍然没有显示什么错误,我可以在一些地方发布一个示例应用程序。
答案 0 :(得分:4)
有一个逗号丢失:
<TextBox Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ViewModel.Text}"/>
修改强>
Add Mode = TwoWay to binding:
<TextBox Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ViewModel.Text, Mode=TwoWay}"/>
<强> EDIT2 强>
知道了!我可以重现并修复它。
在绑定中用Self替换TemplatedParent。 Read this explanation