设置 DataContext 后 PropertyChanged 事件为 null

2023-12-31

我将视图构造函数中视图的 DataContext 设置为 ViewModel 的实例,只是标准的东西。此后不久,一个UPDATE_RECENT_DOCUMENTS_LIST事件从事件聚合器触发,我的 ViewModel 正确捕获了该事件。更改属性并调用 onPropertyChanged 方法,但由于 PropertyChanged 事件为空而失败。

我接下来要做的就是对 UI 执行一个操作,该操作会引发创建项目事件和相同的 ViewModel 正在接收事件,但现在 PropertyChanged 事件不再为 null 并且一切都按预期工作。

设置 DataContext 之后,在注册到 PropertyChanged 事件之前是否必须经过特定的时间?是否有一个我可以等待的事件来确保 PropertyChanged 事件不为空?

另外,在集成 Prism 并使用非常方便的 EventAggregator 之后,我在使用标准 .NET 事件时没有遇到此问题。

我将在 View 和 ViewModel 后面显示我的代码,为简洁起见,省略了 View XAML。

ToolBarView.xaml.cs:

namespace ToolBarModule
{   

public partial class ToolBarView : UserControl
    {                           
        public ToolBarView(ToolBarViewModel toolBarViewModel)
        {
            InitializeComponent();             
            this.DataContext = toolBarViewModel;                                
        }        
    }
}

工具栏视图模型.cs

namespace ToolBarModule
{

public class ToolBarViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private ToolBarCommands baseCommands;
    private IEventAggregator eventAggregator;

    private KickStartEvent kickStartEvent;
    private SubscriptionToken subscriptionToken;

    private ObservableCollection<IDocumentReference> recentDocuments = new ObservableCollection<IDocumentReference>();

    private ActionCommand newTest;
    private ActionCommand openTest;
    private ActionCommand saveTest;        
    private ActionCommand exitApplication;

    public ToolBarViewModel(){}

    public ToolBarViewModel(IEventAggregator eventAggregator)
    {
        this.eventAggregator = eventAggregator;
        baseCommands = new ToolBarCommands(eventAggregator);
        kickStartEvent = eventAggregator.GetEvent<KickStartEvent>();
        subscriptionToken = kickStartEvent.Subscribe(kickStartEventHandler, ThreadOption.UIThread, true, toolBarEventHandlerFilter);            
    }

    public ICommand NewTest
    {
        get
        {
            if (newTest == null)
            {
                newTest = new ActionCommand(baseCommands.NewTestAction);
            }
            return newTest;
        }
    }

    public ICommand OpenTest
    {
        get
        {
            if (openTest == null)
            {
                openTest = new ActionCommand(baseCommands.OpenTestAction);
            }
            return openTest;
        }
    }

    public ICommand SaveTest
    {
        get
        {
            if (saveTest == null)
            {
                saveTest = new ActionCommand(baseCommands.SaveTestAction);
            }
            return saveTest;
        }
    }


    public ICommand ExitApplication
    {
        get
        {
            if (exitApplication == null)
            {
                exitApplication = new ActionCommand(baseCommands.ExitApplicationAction);
            }
            return exitApplication;
        }
    }

    public ObservableCollection<IDocumentReference> RecentDocuments
    {
        get
        {
            return recentDocuments;
        }

        set
        {
            recentDocuments = value;
            onPropertyChanged("RecentDocuments");
        }
    }

    private void onPropertyChanged(string propertyChanged)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this,new PropertyChangedEventArgs(propertyChanged));
        }

    }

    private void kickStartEventHandler(KickStartEventsArgs e)
    {
        switch (e.EventType)
        {
            case KickStartEventsArgs.KickStartEventType.CREATE_PROJECT:
                onPropertyChanged("RecentDocuments");
            break;                


            case KickStartEventsArgs.KickStartEventType.UPDATE_RECENT_DOCUMENTS_LIST:
            RecentDocuments.Clear();

            foreach (IDocumentReference recentDocs in e.KickStartTestList)
            {
                RecentDocuments.Add(recentDocs);
            }
            onPropertyChanged("RecentDocuments");
            break;
        }
    }
}

}


您还可以尝试在 UserControl 下设置 Grid 或 Element 的 DataContext。对我来说它有效。

例子 (Doesn't如果您使用 DependencyProperty 则有效):

背后代码:

public MyUserControl()
{
     InitializeComponent();
     this.DataContext = new { LabelText = "Hello World!" };
}

XAML

<UserControl x:Class="CoolProject.ViewModel.MyUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
<Label x:Name="myLabel" Content="{Binding LabelText}"/>

示例2(我的工作代码):

背后代码:

public MyUserControl()
{
     InitializeComponent();
     this.myGrid.DataContext = new { LabelText = "Hello World!" };
}

XAML

<UserControl x:Class="CoolProject.ViewModel.MyUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">

<Grid x:Name="myGrid">
    <Label x:Name="myLabel" Content="{Binding LabelText}"/>
</Grid>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设置 DataContext 后 PropertyChanged 事件为 null 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 重载<<的返回值

    include
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • GCC 不喜欢带空格的 C++ 风格转换 [重复]

    这个问题在这里已经有答案了 我正在将一些 C 代码移植到 GCC 显然 当涉及空间时 它对 C 样式转换不满意 如unsigned int 1 long long ShortVar 等等 它给出了error expected primary
  • PDF 规范中“base 14”字体的字体规格

    我一直在编写软件来解析 PDF 中的内容 特别是分成区域的文本 为此 我需要字体度量 例如字形位移 字体宽度上升 下降和字形边界框等 简而言之 PDF 中字体定义的 FontDescriptor 字典中应提供的度量类型 不幸的是 对于基本字
  • 在 Python 中解析 XML 的最快方法

    我正在尝试寻找最快的方法来解析智能手机中的传感器数据以用于实时应用程序 格式如下
  • UITableView 页脚,停止浮动在内容上

    我想让我的 UITableView 页脚停止漂浮在我的内容上 就像默认活动一样 我希望我的页脚是 好吧 页脚 始终是在表格视图末尾显示的最后一个视图 实际上 标题也是如此 有没有什么简单的方法可以在滚动时禁止它浮动在表格视图的顶部 谢谢大家
  • np.power 还做了哪些额外的工作?

    我意识到np power a b 慢于np exp b np log a import numpy as np a b np random random 2 100000 timeit np power a b best of 3 4 16
  • jQuery 1.3 只选择第一个元素

    我不确定这是否是一个错误 或者只是 jQuery 1 3 中我不知道的一些疯狂的新事物 或者我只是疯了 我有一个表 其中有 11 个复选框 我无法使用 jQuery 1 3 将它们全部选中 jQuery 1 2 6 myTable find
  • 如何使用官方 10gen C# 驱动程序设置地理值的序列化选项?

    考虑这个类 public class Location public Coordinates Geo get set public Location Geo new Coordinates public class Coordinates
  • jquery删除新行然后用块元素包装文本节点

    我有一些这样的段落 这是第一段 r r n n 这 是第二个有很多新行的 在 n n n n n n 和最后一段之后 n r r 我想删除新行并将每个段落用 p 标签 我期望输出如下 p p This is the first para p
  • Windows 头文件中的“#ifdef _MAC”是什么意思?

    我正在浏览 Windows Platform SDK 头文件 真是太棒了 对吧 我注意到很多地方都包含对预处理器符号的引用 MAC 例如 WinUser h line 1568 Message structure typedef struc
  • 控制器策略/垃圾收集(销毁)

    试图找出我的应用程序关于 MVC 的 ember 最佳实践 另外供参考 我正在使用 ember data ember layout 和 ember route manager 我将以用户为例 我觉得我想做的是从数据库中获取用户模型 然后将其
  • 如何用Python做华夫饼图? (方形饼图)

    Something like this 有一个很好的包在 R 中做到这一点 https github com hrbrmstr waffle 在Python中 我能想到的最好的办法就是使用squarify包 灵感来自关于如何制作树形图的帖子
  • 如何在 C# 3.5 中对泛型方法施加接口约束?

    我想在 C 3 5 中实现这样的目标 public void Register
  • Elasticsearch 访问日志

    我正在尝试追踪谁向 ElasticSearch 集群发出查询 Elastic 似乎没有访问日志 有没有地方可以找出哪个 IP 正在访问集群 Elasticsearch 不提供任何开箱即用的安全性 即有目的和有意设计 所以你有几个解决方案 不
  • 如何使用 pdfbox 生成可下载的 PDF(损坏的 PDF)?

    如何使 PDF 文件可通过链接下载 我正在使用 JSF 构建一个 Web 应用程序 当用户单击 另存为 PDF 链接时 应该可以下载 PDF 到目前为止 我有一个生成 PDF 文件的工作代码 但该文件保存在我的桌面上 我想要做的是 当用户单
  • 检测 iPhone 应用程序的 iPad 2x 按钮

    有没有办法检测您的 iPhone 应用程序在 iPad 上运行 2x 1x 我需要能够检测我的应用程序每英寸点数的差异 检查scale财产 UIScreen mainScreen scale 这是一个方便的功能 BOOL screenIs2
  • 将 *.lib 文件与 MinGW 链接

    是否可以链接 lib与 MinGW 一起使用文件 我将其与 Eclipse 一起使用 我正在与 libcurl OpenSSL 作斗争 我不明白我的错误是否是因为我尝试使用 lib MinGW 中的文件或其他错误 lib libeay32
  • 将 Phoenix 项目拆分为应用程序

    Mix 提供了一个伞式项目的功能 其中独立的功能 应用程序 可以一起运行 但可以松散耦合并单独开发 在我的 phoenix 应用程序中 我想将身份验证逻辑移动到一个单独的应用程序中 以便稍后重用它 然而 对于我的身份验证应用程序 模块 我需
  • 如何找到 Hive 中表的上次修改时间戳?

    我正在尝试获取 Hive 中表的最后修改时间戳 请使用以下命令 show TBLPROPERTIES table name transient lastDdlTime
  • 跟踪以查看 AngularJS 中视图何时发生变化

    有谁知道如何在视图改变时使角度射击成为事件 或者在请求并下载视图时 我正在尝试添加页面更改时的加载动画 看一眼这个线程 https groups google com d topic angular OroP1DBE6AA discussi
  • 设置 DataContext 后 PropertyChanged 事件为 null

    我将视图构造函数中视图的 DataContext 设置为 ViewModel 的实例 只是标准的东西 此后不久 一个UPDATE RECENT DOCUMENTS LIST事件从事件聚合器触发 我的 ViewModel 正确捕获了该事件 更