Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当绑定到ViewModel属性时,WPF用户控件依赖项属性无法工作

当绑定到ViewModel属性时,WPF用户控件依赖项属性无法工作
EN

Stack Overflow用户
提问于 2014-08-18 12:57:34
回答 1查看 869关注 0票数 1

我有两个用户控件:一个LocationTreeView和一个LocationPicker。LocationTreeView将位置组织到树结构中。由于所涉及的位置数,一次只加载树的一部分(一次加载一个级别,然后展开项)。

LocationPicker只不过是一个带有按钮的文本块,该按钮打开了一个带有LocationTreeView的模态窗口。

当我将LocationPicker的"SelectedLocation“属性绑定到我的视图模型时,它工作得很好。当我将我的LocationTreeView绑定到视图模型时,绑定似乎没有任何效果。当我将我的LocationTreeView绑定到一个“虚拟”LocationPicker (它绑定到我的视图模型)时,它可以工作。如何使我的LocationTreeView绑定到我的视图模型?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public partial class LocationTreeView: UserControl
{
    public EventHandler LocationChanged;
    ...

    public static readonly DependencyProperty SelectedLocationProperty = 
         DependencyProperty.Register("SelectedLocation",typeof(Location), typeof(LocationTreeView),
         new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, SelectedLocationChanged));
    ...

    public static void SelectedLocationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
         LocationTreeView sender = (d as LocationTreeView);
         Location loc = e.NewValue as Location;
         //Navigate the treeview to the selected location
         sender.LoadLTreeViewPathToLocation(loc);
    }

    public Location SelectedLocation
    {
         get { return (Location)GetValue(SelectedLocationProperty); }
         set
         {
              if (SelectedLocation != value)
              {
                 SetValue(SelectedLocationProperty, value);
                 if (LocationChanged != null)
                 {
                     LocationChanged(this, EventArgs.Empty);
                 }
              }
         }
    }
    ...
}

绑定此控件时,绑定到另一个控件时工作良好,但绑定到我的视图模型时不起作用。我在SelectedLocationChanged回调中设置了一个断点,当我设置viewmodel属性(它确实实现了INotifyPropertyChanged)时,它似乎不会被触发。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public partial class LocationPicker: UserControl
{
    public static readonly DependencyProperty SelectedLocationProperty = 
         DependencyProperty.Register("SelectedLocation",typeof(Location), typeof(LocationPicker),
         new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
    ...

    public Location SelectedLocation
    {
         get { return (Location)GetValue(SelectedLocationProperty); }
         set { SetValue(SelectedLocationProperty, value); }
    }
    ...

    private void Button_Click(object sender, RoutedEventArgs e)
    {
         // create a window with a locationtreeview on it. Set the treeview's
         // selectedlocation property, open the window, wait for the window to close,
         //  set this.SelectedLoctation to the treeview's selected location.
    }
}

我很抱歉遗漏了这么多代码。我的工作环境使我无法复制/粘贴。

我遗漏了ViewModel的代码。我深信这不是问题所在。

更新: LocationTreeView有一个在xaml中设置的ViewModel

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<UserControl.DataContext>
    <VM:LocationTreeViewViewModel />
</UserControl.DataContext>

LocationPicker没有ViewModel。在我使用控件的窗口上,xaml看起来如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Widow.DataContext>
    <VM:TestWindowViewModel />
</Window.DataContext>
<Grid>
...
<UC:LocationPicker x:Name="picker" SelectedLocation="{Binding Location}" /> 

<!-- this does not work -->
<UC:LocationTreeView SelectedLocaiton="{Binding Location}" />

<!-- but this works --->
<UC:LocationTreeView SelectedLocaiton="{Binding SelectedLocation, ElementName=picker}" />
...
</Grid>
EN

回答 1

Stack Overflow用户

发布于 2014-08-19 00:06:56

如果希望将数据绑定从视图模型绑定到LocationTreeView,则应使用要绑定到的视图模型中的属性。如果视图模型中有一个名为SelectedLocationInViewModel的属性,那么您应该使用它来绑定到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<UC:LocationTreeView SelectedLocation="{Binding SelectedLocationInViewModel}" />

我想我知道你现在有什么问题了.您希望在UserControl中定义一些属性并将数据绑定到它们,但也希望将数据绑定到设置为DataContext的视图模型中的属性。你需要用RelativeSource Binding来做.只需查看以下示例中的Binding Path

将数据绑定到UserControl中从UserControl中声明的属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ItemsControl ItemsSource="{Binding PropertyName, RelativeSource={RelativeSource 
    AncestorType={x:Type YourPrefix:YourUserControl}}}" />

将数据绑定到在任何对象集中声明为DataContext的属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ItemsControl ItemsSource="{Binding PropertyName}" />
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25371904

复制
相关文章
WPF依赖属性(wpf 依赖属性)
依赖属性就是一种自己可以没有值,并且可以通过绑定从其他数据源获取值。依赖属性可支持WPF中的样式设置、数据绑定、继承、动画及默认值。
全栈程序员站长
2022/07/28
2.2K0
WPF依赖属性(wpf 依赖属性)
学习WPF——初识依赖项属性
入门 首先创建一个依赖项属性 然后绑定父容器的DataContext到这个依赖项的实例 接着绑定子元素的属性到依赖项属性(注意Button的Content属性) 程序最终的运行结果: 说明 首先是定义
liulun
2018/01/12
9400
学习WPF——初识依赖项属性
[翻译] WPF 中用户控件 DataContext/Binding 和依赖属性的问题
ProgrammingDude(asked Dec 8, 2015 at 21:24)
独立观察员
2022/12/06
9840
WPF 依赖属性绑定不上调试方法
在写 WPF 程序的时候会遇到依赖属性绑定了,但是值没有更新或者没有绑定上的问题,本文告诉大家可以如何调试
林德熙
2020/07/06
1.7K0
WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了
如果你写了一个 MarkupExtension 在 XAML 当中使用,你会发现你在 MarkupExtension 中定时的属性是无法使用 XAML 绑定的,因为 MarkupExtension 不是一个 DependencyObject。
walterlv
2020/02/10
1.7K0
WPF面试题-来自ChatGPT的解答
问题来自【愚公系列】2023年07月 WPF控件专题 2023秋招WPF高频面试题[1],回答站长通过ChatGPT重新整理,可对比两者区别学习、整理。
沙漠尽头的狼
2023/08/31
4510
WPF面试题-来自ChatGPT的解答
WPF 调试依赖属性变更方法
在 WPF 里面,所有的依赖属性都有带通知的功能,通过带通知的功能,可以在通知里加上断点,通过调用堆栈了解是哪个模块调用的
林德熙
2022/08/12
4070
在 WPF 中获取一个依赖对象的所有依赖项属性
本来 .NET 中提供了一些专供设计器使用的类型 TypeDescriptor 可以帮助设计器找到一个类型或者组件的所有可以设置的属性,不过我们也可以通过此方法来获取所有可供使用的属性。
walterlv
2023/10/22
4120
[UWP]依赖属性2:使用依赖属性
以上代码为一个相对完成的依赖属性例子(还有一些功能比较少用就不写出了),从这段代码可以看出,自定义依赖属性的步骤如下:
dino.c
2019/01/18
1.4K0
C# WPF MVVM开发框架Caliburn.Micro 关于Conventions⑧
Caliburn.Micro的一个主要特性是,它能够通过一系列约定消除对锅炉铭牌代码的需求。有些人喜欢习俗,有些人讨厌习俗。这就是为什么CM的约定是完全可定制的,如果不需要,甚至可以完全关闭。如果您要使用约定,并且由于它们在默认情况下处于启用状态,那么最好了解这些约定是什么以及它们是如何工作的。这就是本文的主题。
用户9127601
2022/01/13
2.8K0
WPF依赖属性的正确学习方法
我在学习WPF的早期,对依赖属性理解一直都非常的不到位,其恶果就是,我每次在写依赖属性的时候,需要翻过去的代码来复制黏贴。
Kiba518
2019/07/25
2K0
WPF依赖属性的正确学习方法
当css属性width设为100%时
  平常在写页面html代码时,经常会使用到width:100%来使控件宽度为父控件的内容宽度。但如果父控件为body,而且没有明确设置body的宽度,那么就会出现以下的情况了。   代码: 1 <body> 2 <div style="background:#888;width:100%;height:200px"> 3 <div style="width:1000px;height:100px;margin:0 auto;border:solid 1px red"></div> 4 </di
^_^肥仔John
2018/01/18
1.4K0
当css属性width设为100%时
win10 uwp DataContext
本文告诉大家DataContext的多种绑法。 适合于WPF的绑定和UWP的绑定。 我告诉大家很多个方法,所有的方法都有自己的优点和缺点,可以依靠自己喜欢的用法使用。当然,可以在新手面前秀下,一个页面一个绑定方法。
林德熙
2018/09/19
8730
win10 uwp DataContext
win10 uwp DataContext
本文告诉大家DataContext的多种绑法。 适合于WPF的绑定和UWP的绑定。 我告诉大家很多个方法,所有的方法都有自己的优点和缺点,可以依靠自己喜欢的用法使用。当然,可以在新手面前秀下,一个页面一个绑定方法。
林德熙
2022/08/04
5060
win10 uwp 依赖属性
本文告诉大家如何使用依赖属性,包括在 UWP 和 WPF 如何使用。 本文不会告诉大家依赖属性的好处,只是简单告诉大家如何使用。
林德熙
2018/09/19
8390
win10 uwp 依赖属性
如何在保留原本所有样式/绑定和用户设置值的情况下,设置和还原 WPF 依赖项属性的值
WPF 备份某控件的一些属性,做一些神奇的操作,然后再还原这些属性。多么司空见惯的操作呀!然而怎么备份却是值得研究的问题。直接赋值?那一定是因为你没踩到一些坑。
walterlv
2023/10/22
2000
EXTJS7 publishes将配置属性发布到viewModel
此例中,虽然viewModel.data中有mycomponent-a: {prop1:xxx},但是textfield的绑定是无效的
路过君
2022/04/26
3620
WPF自学入门(十)WPF MVVM简单介绍
   前面文章中,我们已经知道,WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI。
黄昏前黎明后
2019/08/26
2.5K0
WPF自学入门(十)WPF MVVM简单介绍
Xamarin 和 WPF 的控件和属性的替换
基本上 Xamarin 和 WPF 的技术是相同的,但是有一些小细节和属性不同,本文记录一些不同的点,方便小伙伴将 WPF 项目迁移为 Xamarin 项目
林德熙
2020/02/18
1.6K0
2018-10-28-WPF的只读依赖属性
依赖属性的概念大家应该都很清楚,那么什么是只读依赖属性呢? ---- 为何要用只读依赖属性 当某些时候,你的依赖属性只是为了表征一种多因素影响的复合状态。这种状态不适合由外部显示设置。比如常见的IsMouseOver,当且仅当这个属性由鼠标输入设备进行内部赋值时,结果才是有效的。而在于外部进行赋值时,其值和相应的真实设备状态是不一致的。 只读依赖属性的局限 由于不可设置,只读依赖属性会被限制众多解决方案,如数据绑定,验证,动画,继承等等。 只读依赖属性的用法 由于仍可以在属性发生改变时引发通知,只读依赖属
黄腾霄
2020/06/10
6120

相似问题

WPF:无法绑定到用户控件中的依赖项属性

11

绑定到用户控件的WPF依赖项属性

11

WPF -绑定到用户控件依赖项属性失败

12

Wpf用户控件依赖项属性绑定

10

绑定到用户控件WPF/XAML的依赖项属性

46
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文