【问题标题】:Binding to DependancyProperty绑定到依赖属性
【发布时间】:2016-01-22 22:19:41
【问题描述】:

我的 XAML 无法绑定,我不明白为什么

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

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

这有一个 MyViewModel.cs 的 DataTemplate

如您所见,我使用了 ThresholdName 两次。当我运行我的应用程序时,我可以看到ExpanderHeader 中的ThrehsoldName,表明此时绑定很好。问题是绑定到我的“属性”对象。

属性视图是

<Grid>
    <TextBlock Text="{Binding Name}" />
</Grid>

ViewModel(继承自DependancyObject)是

    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); }
    }

我得到的错误信息是

System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。绑定表达式:路径=时间;数据项=空;目标元素是“PropertiesVm”(HashCode=6494098);目标属性是“名称”(类型“字符串”)

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

<DataTemplate DataType="{x:Type viewModel:PropertiesVm}">
    <view:PropertiesView />
</DataTemplate>

This post 建议添加 x:Name 但这没有帮助

为什么我的属性视图模型中的属性Name 永远不会被设置?或者我只能使用 UserControl 来执行此操作,绑定到后面的代码?

【问题讨论】:

  • stackoverflow.com/questions/29916756/… 如果您想使用具有依赖属性的用户控件,请勾选此项
  • @blindmeis,谢谢你,这是很好的信息,但我没有在我的 userControl 中设置 DataContext,它自然地从我认为的父级继承它
  • 和@blindmeis,同样的问题仍然存在......
  • 用户控件中与 DP 的绑定应始终具有 ElemenName 绑定或 RelativSource 绑定。我更喜欢第一个。我在你的 xaml 中没有看到这个。如果您有绑定问题,请使用 Snoop。您可以在运行时检查您的 Datacontext。

标签: wpf mvvm


【解决方案1】:

你有点面子问题。

您的 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>

【讨论】:

  • 如果我这样做了,我将如何绑定 Name 属性?
  • 是的,抱歉...您的视图模型是 FrameworkElement 还是 DepedencyObject?
  • ...稍微更新了我的答案,认为您只需要稍微扭曲一下您的模型...
猜你喜欢
  • 2023-03-26
  • 2018-05-21
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
相关资源
最近更新 更多