DataTrigger,通过TemplatedParent绑定到嵌套属性

时间:2011-04-12 10:28:15

标签: wpf xaml binding

根据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。这些也绑定到嵌套属性。我现在认为这些触发器无法触发。我已经更新了代码。如果它仍然没有显示什么错误,我可以在一些地方发布一个示例应用程序。

1 个答案:

答案 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