我的 WPF 自定义控件 Datacontext 正在取代父控件

2023-11-22

在我的主窗口中,我尝试绑定到bool,但它正在寻找我的自定义控件DataContext反而。如果我不分配DataContext在用户控件中,则主窗口的绑定可以工作,但是(显然)这会阻止用户控件中的绑定。

这是错误:

System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“MyUserControlModel”(HashCode=1453241) 上找不到“MyControlVisible”属性。 BindingExpression:Path=MyControlVisible; DataItem='MyUserControlModel'(哈希码=1453241);目标元素是“MyUserControl”(名称=“_myUserControl”);目标属性是“可见性”(类型“可见性”)

我需要绑定才能在两个控件上工作,但我不希望用户控件的DataContext取代窗口的。

这是代码:

<Window x:Class="Sandbox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Controls="clr-namespace:Sandbox.Controls" Title="Sandbox">
    <DockPanel LastChildFill="True">
        <DockPanel.Resources>
            <BooleanToVisibilityConverter x:Key="boolToVis" />
        </DockPanel.Resources>
        <Grid>
            <Controls:MyUserControl x:Name="_myUserControl" Visibility="{Binding MyControlVisible, Converter={StaticResource boolToVis}}"/>
        </Grid>
    </DockPanel>
</Window>

namespace Sandbox
{
    public partial class MainWindow
    {
        private MainWindowModel model;
        public MainWindow()
        {
            InitializeComponent();
            DataContext = model = new MainWindowModel();
            _myUserControl.Initialize(model.MyUControlModel);
        }
    }
}

using System.ComponentModel;
using Sandbox.Controls;

namespace Sandbox
{
    public class MainWindowModel : BaseModel
    {
        public MyUserControlModel MyUControlModel { get; set; }
        public bool MyControlVisible { get; set; }
        public MainWindowModel()
        {
            MyUControlModel = new MyUserControlModel();
            MyControlVisible = false;
            OnChange("");
        }
    }

    public class BaseModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnChange(string s)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(s));
            }
        }
    }
}

<UserControl x:Class="Sandbox.Controls.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">
    <Grid>
        <TextBlock Text="{Binding MyBoundText}"/>
    </Grid>
</UserControl>

namespace Sandbox.Controls
{
    public partial class MyUserControl
    {
        public MyUserControl()
        {
            InitializeComponent();
        }

        public void Initialize(MyUserControlModel context)
        {
            DataContext = context;
        }
    }

}

namespace Sandbox.Controls
{
    public class MyUserControlModel : BaseModel
    {
        public string MyBoundText { get; set; }
        public MyUserControlModel()
        {
            MyBoundText = "Hello World!";
            OnChange("");
        }
    }
}

这是您永远不应该设置的众多原因之一DataContext直接从UserControl本身。

当您这样做时,您将无法再使用任何其他DataContext因为 UserControl 的DataContext被硬编码在.

对于您的绑定,通常是DataContext会被继承,所以Visibility绑定可以找到属性MyControlVisible就目前的DataContext,但是因为您硬编码了DataContext在您的 UserControl 的构造函数中,找不到该属性。

您可以在绑定中指定不同的绑定源,例如

<Controls:MyUserControl Visibility="{Binding 
    RelativeSource={RelativeSource AncestorType={x:Type Window}}, 
    Path=DataContext.MyControlVisible, 
    Converter={StaticResource boolToVis}}" ... />

然而,这只是针对此特定情况的问题的解决方法,在我看来这并不是永久的解决方案。更好的解决方案是简单地不硬编码DataContext在你的UserControl

根据用户控件的用途以及应用程序的设计方式,您可以采用几种不同的方法。

  • 你可以创建一个依赖属性在您的 UserControl 上传递值并绑定到该值。

    <Controls:MyUserControl UcModel="{Binding MyUControlModelProperty}" ... />
    

    and

    <UserControl x:Class="Sandbox.Controls.MyUserControl"
                 ElementName=MyUserControl...>
        <Grid DataContext="{Binding UCModel, ElementName=MyUserControl}">
            <TextBlock Text="{Binding MyBoundText}"/>
        </Grid>
    </UserControl>
    
  • 或者你可以建立你的UserControl期望特定的属性将被传递给它DataContext。这通常是我所做的,结合DataTemplates.

    <Controls:MyUserControl DataContext="{Binding MyUControlModelProperty}" ... />
    

    and

    <UserControl x:Class="Sandbox.Controls.MyUserControl"...>
        <Grid>
            <TextBlock Text="{Binding MyBoundText}"/>
        </Grid>
    </UserControl>
    
  • 正如我上面所说,我喜欢使用DataTemplates显示我的UserControls期望特定类型的Model他们的DataContext,所以通常我的主窗口 XAML 看起来像这样:

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

我的 WPF 自定义控件 Datacontext 正在取代父控件 的相关文章

  • 在 LINQ 查询中进行转换

    是否可以在 LINQ 查询中进行强制转换 为了编译器的缘故 下面的代码并不糟糕 但最好将其放入一个查询中 Content content dataStore RootControl as Controls Content List
  • SOAP Web 服务:多台服务器,一个接口

    我有一个场景 需要任意数量的服务器来提供相同的 SOAP Web 服务 我想生成一组代理类 并能够为它们提供一个位置 以便在运行时将它们指向不同的服务器 不幸的是 看起来好像wsdl port节点 子节点wsdl service 要求对特定
  • 来自 double 的 static_cast 可以优化分配给 double 吗?

    我偶然发现了一个我认为不必要的功能 并且通常让我感到害怕 float coerceToFloat double x volatile float y static cast
  • CMake(Ninja 后端)使用 /MT 编译

    我有一个类似的问题CMake 使用 MT 而不是 MD 进行编译 https stackoverflow com questions 14172856 cmake compile with mt instead of md但有一些差异 我正
  • 从结构调用 C++ 成员函数指针

    我找到了有关调用 C 成员函数指针和调用结构中的指针的信息 但我需要调用结构内部存在的成员函数指针 但我无法获得正确的语法 我在类 MyClass 的方法中有以下代码片段 void MyClass run struct int MyClas
  • 获取列表框中视图中的项目

    我有一个 ListBox 其属性 VirtualizingStackPanel VirtualizationMode 设置为 回收 我正在绑定一个自定义集合 实现IList and IList
  • 在 C# 中解析 JS Date.toIsoString

    我需要将 JS 日期存储为 ISO 8601 日期 我目前正在从格式为 2019 06 22T00 00 00 000Z 的表单中获取日期 正如 JS 的 toIsoString 方法所期望的那样 当这个日期传递到我的 API 控制器时 我
  • 用于 C++ 中图像分析的 OpenCV 二进制图像掩模

    我正在尝试分析一些图像 这些图像的外部周围有很多噪声 但内部有一个清晰的圆形中心 中心是我感兴趣的部分 但外部噪声正在影响我对图像的二进制阈值处理 为了忽略噪音 我尝试设置一个已知中心位置和半径的圆形蒙版 从而使该圆之外的所有像素都更改为黑
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • 使用 STL 流时如何格式化我自己的对象?

    我想将我自己的对象输出到 STL 流 但具有自定义格式 我想出了这样的东西 但由于我之前从未使用过 locale 和 imbue 所以我不知道这是否有意义以及如何实现 MyFacet 和operator 所以我的问题是 这是否有意义以及如何
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • 运行实体框架自定义工具,它有什么作用?

    在 Visual Studio 中 当使用实体框架并为 tt 和 Context tt 文件应用运行自定义工具时 它是什么以及它有什么作用 为什么它解决数据库同步问题 有时 为什么我应该在运行 tt 之前运行它 Context tt 它被称
  • 为什么这个位图图像在加载后会改变大小?

    快速提问 我有这个1000 1000位图图像 我使用这个例程来加载它 private BitmapSource initialBitmap new BitmapImage new Uri C Users Desktop Original b
  • 在 clang 中向量化函数

    我正在尝试根据此用 clang 对以下函数进行矢量化铿锵参考 http llvm org docs Vectorizers html 它采用字节数组向量并根据以下条件应用掩码this RFC https www rfc editor org
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • Windows Phone 的 JSON 反序列化

    我正在尝试反序列化以下 JSON 但我真的不知道如何使用 JSON net 来完成这项工作 我正在使用 C 和 JSON Net 库 我的 JSON 如下 found 3 bounds 43 54919 172 62148 43 54487
  • C++ 中的析构函数

    我的 AB h 文件中有一个构造函数 class AB private int i public AB i 0 constructor AB i 0 destructor virtual void methodA unsigned int
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem
  • NHibernate:无状态会话错误消息无法获取代理

    我正在使用 nHibernate 无状态会话来获取对象 更新一个属性并将对象保存回数据库 我不断收到错误消息 无状态会话无法获取代理 我在其他地方有类似的代码 所以我不明白为什么这不起作用 有谁知道问题可能是什么 我正在尝试更新Screen

随机推荐

  • 从无序列表中删除填充

    有件事困扰了我很多年 如果你看这把小提琴 您将看到一个简单的无序列表 其中 a 元素上有一些填充以及用于创建框的背景颜色 列表中的每个项目之间有空格 如何摆脱它 使盒子水平接触 Html is div ul li a href One a
  • Regex.IsMatch 与 string.Contains

    这两个等效表达式的速度 内存使用有什么区别 Regex IsMatch Message 1000 Vs Message Contains 1000 在任何情况下 一个人比另一个人更好吗 这个问题的背景是这样的 我正在对包含正则表达式的遗留代
  • 在 MATLAB 中填充图像

    我有一个尺寸为 61x56 的图像 我想将图像填充到尺寸 392x392 我正在尝试使用padarray但由于我得到一个非整数值 我无法做到这一点 谁能帮我这个 多谢 我已在下面附加了我想要做的事情 K imread test jpg K
  • Spring-WS 1.5 可以与 Spring 3 一起使用吗?

    Spring ws 1 5 9依赖于Spring 2 5 基于pom 它可以与 Spring 3 一起使用而不会遇到任何类加载问题吗 我知道某些包在两者之间匹配 我可以不包含那些 Spring 3 jar 吗 我似乎找不到任何官方说法 除了
  • 为什么VS2013抱怨“使用未初始化的内存”?

    我有一个这样的代码 include
  • FindFirstChangeNotification 两次通知更改

    我想监视文件系统中的文件夹 假设我想监视文件夹 C MyNewFolder 我有这个代码来做到这一点 HANDLE ChangeHandle FindFirstChangeNotification T C MyNewFolder FALSE
  • 我应该使用 JavaScript 还是服务器渲染此模板?

    我正在渲染新闻提要 我计划使用 Backbone js 来处理我的 javascript 内容 因为我厌倦了使用 JQuery 进行手动 DOM 绑定 所以现在我正在考虑两个选择 当用户加载页面时 新闻源 容器是空白的 但该页面会触发 Ja
  • 数据库 [dbName] 不可访问。 (对象资源管理器)

    我在使用 SQL Server 2008 R2 时遇到问题 我最近遇到了计算机问题 因此我必须重新启动 Windows 并且必须将一个用户的权限授予另一用户 使用属性中的安全功能 但最初授予权限时 会显示 访问被拒绝 消息 经过大量研究后
  • 当 jac=False 时不使用雅可比行列式进行近似时,“牛顿 CG 方法需要雅可比行列式”?

    我正在使用 scipy optimize minimize 进行优化 并尝试使用以下方法 Newton CG dogleg 和 trust ncg 据我了解 对于这些方法 需要目标函数的雅可比行列式 但是 那文档表明如果 jac 设置为 F
  • iOS 7 中的静默推送通知不起作用

    在 WWDC 2013 的 多任务处理的新增功能 演示中 有一个关于静默推送通知的部分 看起来很简单 根据演示 如果发送 APS 负载时仅将 content available 设置为 1 则用户将不会收到通知 A This doesn t
  • TFS 2017 Build 自动启动并不断失败

    我有一个 TFS 2017 服务器版本 它链接到一个位存储桶 Git 存储库 构建设置为当主控更改时自动启动 这工作得很好 如果我手动启动 master 或分支的构建也工作得很好 但我不断收到这些随机启动的失败构建项目收集服务帐户 他们总是
  • Python / Scipy - 将optimize.curve_fit的sigma实现到optimize.leastsq中

    我正在使用逻辑模型拟合数据点 由于有时我的数据存在 ydata 错误 因此我首先使用 curve fit 及其 sigma 参数在拟合中包含我个人的标准差 现在我切换到leastsq 因为我还需要一些curve fit无法提供的拟合优度估计
  • 如何在我的页面操作弹出窗口中获取当前打开的选项卡的 URL?

    我想创建一个扩展来自动登录我的服务器 因此 我创建了一个后台页面来检查当前 URL 如果它符合我的 URL 正则表达式 我将显示页面操作图标 单击页面操作后 我将打开一个包含一些字段的弹出窗口 我需要获取当前打开的 URL 并将其填充到弹出
  • C++ CSV 解析(引号内包含逗号)

    我正在构建一个 C CSV 数据解析器 我正在尝试访问文件的第一列和第十五列 并使用以下命令将它们读入两个数组getline命令 例如 for int j 0 j
  • php pdo准备重复变量

    在编写pdo语句时 是否可以重复变量的值 我是说 query UPDATE users SET firstname name WHERE firstname name stmt dbh gt prepare query stmt gt ex
  • Spring/Hibernate 异常:createCriteria 在没有活动事务的情况下无效

    我花了几天时间研究 spring hibernate transaction 问题 我使用 jaxws spring hibernate 创建一个简单的 web 服务 它工作正常 但是当我调用使用事务 bean spring 的 web 方
  • spring boot 2 + feign + eureka 客户端不会将服务名称解析为 URL

    我正在尝试使用 spring cloud Finchley SR1 来启动 spring boot 2 0 5 并尝试使用 Eureka 作为发现服务器和 Feign Ribbon 作为客户端来设置两个服务之间的通信 设置非常简单 尽管我尝
  • 遍历一个c#方法并分析方法体

    在 C 中遍历 methodinfo 最简单的方法是什么 我想遍历方法体并查找字段引用等并检索类型 在 System Reflection 中有 mi GetMethodBody GetILAsByteArray 这有点低级 在我能够遍历身
  • 为什么 HttpWebResponse 上没有 Dispose 方法

    HttpWebReponse实施IDisposable界面 但是为什么没有Dispose方法 它只包含Close方法 将using这门课还可以使用模式吗 HttpWeb响应实施明确的 IDisposable 接口 所以你可以打电话Dispo
  • 我的 WPF 自定义控件 Datacontext 正在取代父控件

    在我的主窗口中 我尝试绑定到bool 但它正在寻找我的自定义控件DataContext反而 如果我不分配DataContext在用户控件中 则主窗口的绑定可以工作 但是 显然 这会阻止用户控件中的绑定 这是错误 System Windows