WPF ViewModel与多个View绑定后如何解决的问题

原文:WPF ViewModel与多个View绑定后如何解决的问题

当重复创建View并绑定同一个ViewModel后,ViewModel中的字段更新,在新的View中的没有反应或者在View中找不到相应的视觉树(如ListBox的ListBoxItem)

初始的解决方案:View关闭后,注销属性Unregister Dependency

如果可以将属性注销,貌似是可行的

注销属性 RemoveDependency(LoadCousewareItemAnimationProperty);

 1 private void RemoveDependency(DependencyProperty prop)
 2 {
 3   var registeredPropertyField = typeof(DependencyProperty).
 4     GetField("RegisteredPropertyList", BindingFlags.NonPublic | BindingFlags.Static);
 5   object list = registeredPropertyField.GetValue(null);
 6   var genericMeth = list.GetType().GetMethod("Remove");
 7   try
 8   {
 9     genericMeth.Invoke(list, new[] { prop });
10   }
11   catch (TargetInvocationException)
12   {
13     Console.WriteLine("Does not exist in list");
14   }
15
16   var propertyFromNameField = typeof(DependencyProperty).
17     GetField("PropertyFromName", BindingFlags.NonPublic | BindingFlags.Static);
18   var propertyFromName = (Hashtable)propertyFromNameField.GetValue(null);
19
20   object keyToRemove = null;
21   foreach (DictionaryEntry item in propertyFromName)
22   {
23     if (item.Value == prop){
24        keyToRemove = item.Key;
25        return;
26     }
27   }
28   if (keyToRemove != null)
29   propertyFromName.Remove(keyToRemove);
30 }

运行了下,注销成功!

但是,随之来的新问题是,因旧View的DataContext依旧绑定着ViewModel,属性注销了,但是ViewModel的字段更新时,会找不到View的属性,直接抛出异常!

正确简洁的处理方案:UnLoaded事件中,设置DataContext = null

字段更新,不会通知到旧View。

值得注意的是,在View的依赖属性中,如属性添加了PropertyChanged事件,一定要将e.NewValue判空。

因属性之前绑定了数据,DataContext = null为空之后,会触发PropertyChanged。

    Loaded += (s, e) =>
    {
        if (DataContext == null)
        {
            DataContext = _viewModel;
        }
    };
    Unloaded += (s, e) =>
    {
        this.DataContext = null;
    };    _viewModel=new ViewModel();

原文地址:https://www.cnblogs.com/lonelyxmas/p/9091135.html

时间: 2024-10-12 02:52:06

WPF ViewModel与多个View绑定后如何解决的问题的相关文章

WPF DataGrid某列使用多绑定后该列排序失效,列上加入 SortMemberPath 设置即可.

WPF DataGrid某列使用多绑定后该列排序失效 2011-07-14 10:59hdongq | 浏览 1031 次  悬赏:20 在wpf的datagrid中某一列使用了多绑定,但是该列排序失效,就是点击他的列表头无法进行排序了.xaml如下:<DataGridTextColumn Width="100" Header="{res:Localize Flexem.Studio.HMIControls.AddressLabel.DataType}">

WPF学习日记——Window的DataContext绑定ViewModel

1.全局的ViewModel绑定: a)设定全局的ViewModel(App.xaml中): 1 <Application x:Class="MyTest.App" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:local=

Service的启动,绑定,绑定后通信,跨应用绑定,跨应用绑定后通信

Service介绍: 与Acitivity平级的Android四大组件之一,对比Activity而言,就是没有交互界面,且可以一直在后台执行,只用于处理下载,I/O等长时间信息交流的任务. Service的生命周期和运行顺序: Service的生命周期只有启动状态和摧毁状态,相比Activity而言,更需要特别注意创建和摧毁的过程. Service运行或被杀死的情况: 1.直接startService()后,若不调用stopService()或stopService()来停止的话,Service

wpf中UserControl的几种绑定方式

原文:wpf中UserControl的几种绑定方式 我们经常会抽取一些可重用的控件,某个属性是否需要重用,直接决定了这个属性的绑定方式. 1.完全不可重用的控件 有一些与业务强相关的控件,它们的属性完全来自ViewModel,越是相对复杂的控件,越容易这样.比如: // ChooseUc.xaml <UserControl> <StackPanel Orientation="Horizontal"> <Label Content="选择一个水果:

wpf中如何在xaml中绑定cs中类的属性

cs代码:/// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); ContentGrid.DataContext = this; this.Path = "数据绑定"; } public string Path { get; set;

绑定后想要把 分好uv的物体传递uv给 绑定好的物体.

绑定后传递uv要使用 polyTransfer 命令 polyTransfer [-alternateObject string] [-caching boolean] [-constructionHistory boolean] [-name string] [-nodeState int] [-uvSets boolean] [-vertexColor boolean] [-vertices boolean] Transfer information from one polygonal o

Data和View分离后必然需要有Event事件

回到今天模型-视图-事件的话题,Data和View分离后必然需要有Event事件的监听和派发机制来建立起数据绑定,我控制欲比较强不是很喜欢AngularJS那种dirty checking的机制,有事件变化我希望马上被通知到,做我该做的处理,至于有人担心性能问题那是多虑了,图形组件发展这么多年已积累无数成熟技巧来规避事件的性能问题. 性能问题倒不用担心,毕竟这方面任务大部分情况都是交由框架实现者去考虑,但不需要用户深入了解框架的实现细节,并不意味着用户可以完全不关系基本架构脉络,框架应用者还是有

解决Android Studio启动项目后一直处于refreshing &#39;View&#39; gradle project,快速解决亲测有效

一直处于refreshing 'View' gradle project最根本的原因是项目中所用到的gradle版本在GRADLE_USER_HOME这个路径下没有找到,所以就利用distributionUrl这个路径进行下载,但是呢下载的时候会非常非常慢,So就一直卡在了refreshing 'View' gradle project 我的这个GRADLE_USER_HOME="C:\Users\Ivan\.gradle\wrapper\dists",大家可以根据自己的路径找到 要快

双网卡绑定后bond是eth3的网卡信息

问题描述:做了双网卡绑定后,发现只有个网卡起作用,只有bond0开启模式,eth都没有开启,拔了eht3后网络就会断开,问题原因是同事之前做双网卡绑定配置错误后重启机器. 问题原因:重启主机后bond0信息记录到了如下文件,正常情况下不会有bond0信息,所以查看并注释后重启,问题解决. [[email protected] network-scripts]# cat /etc/udev/rules.d/70-persistent-net.rules 正确的不会写到这个文件中: # PCI de