绑定到DependancyProperty

时间:2015-10-23 11:33:53

标签: wpf mvvm

我的XAML不会绑定,我看不出原因

使用MVVM,我的MyView.xaml中有以下代码

<Expander Header="{Binding ThresholdName}" IsExpanded="False" >
    <properties:PropertiesVm Name="{Binding ThresholdName}" />
</Expander>

这有一个MyViewModel.cs的DataTemplate

如您所见,我正在使用ThresholdName两次。当我运行我的应用程序时,我可以在Header的{​​{1}}中看到ThrehsoldName,表明此时的绑定没问题。问题是绑定到我的“属性”对象。

属性视图是

Expander

ViewModel(继承自<Grid> <TextBlock Text="{Binding Name}" /> </Grid> )是

DependancyObject

我收到的错误消息是

  

System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:路径=时间;的DataItem = NULL; target元素是'PropertiesVm'(HashCode = 6494098); target属性是'Name'(类型'String')

在我的词典中,我将DataTemplate设置为

    public static readonly DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(PropertiesVm));

    public string Name
    {
        get { return (Convert.ToString(GetValue(NameProperty))); }
        set { SetValue(NameProperty, value); }
    }

This post建议添加<DataTemplate DataType="{x:Type viewModel:PropertiesVm}"> <view:PropertiesView /> </DataTemplate> ,但这没有帮助

为什么我的Properties ViewModel中的属性x:Name永远不会被设置?或者我只能用UserControl执行此操作,绑定到后面的代码?

1 个答案:

答案 0 :(得分:0)

你有点面子。

您的Expander内容需要绑定到顶级视图模型的属性,该属性公开您的PropertiesVm实例。有点像:

public class TopLevelVm
{
  public string ThresholdName { get; }
  public PropertiesVm Properties { get; }
}

然后你的XAML就像:

<Expander Header="{Binding ThresholdName}" Content="{Binding }" />

然后DataTemplate将选择相同的DataContext,您的DataTemplate可能如下所示:

<Grid>
    <TextBlock Text="{Binding ThresholdName}" />
    <!-- Do something with .Properties -->
</Grid>