绑定 UserControl 依赖属性和 MVVM

2024-03-17

我有一个包含 UserControl 的 MainWindow,两者都以 MVVM 模式实现。 MainWindowVM 具有我想要绑定到 UserControl1VM 中的属性的属性。但这行不通。

这是一些代码(视图模型使用某种 mvvm 框架在 ViewModelBase 类中实现 INotifyPropertyChanged 但希望没有问题):

主窗口.xaml:

<Window x:Class="DPandMVVM.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:DPandMVVM"
    Title="MainWindow" Height="300" Width="300">
    <Grid>
        <local:UserControl1 TextInControl="{Binding Text}" />
    </Grid>
</Window>

MainWindow.xaml.cs 后面的代码:

using System.Windows;
namespace DPandMVVM
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new MainWindowVM();
        }
    }
}

MainWindow-ViewModel MainWindowVM.cs:

namespace DPandMVVM
{
    public class MainWindowVM : ViewModelBase
    {
        private string _text;
        public string Text { get { return _text; } }

        public MainWindowVM()
        {
            _text = "Text from MainWindowVM";
        }
    }
}

这里是 UserControl1.xaml:

<UserControl x:Class="DPandMVVM.UserControl1"
             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="300" d:DesignWidth="300">
    <Grid>
        <TextBlock Text="{Binding TextInTextBlock}" />  
    </Grid>
</UserControl>

UserControl1.xaml.cs 背后的代码:

using System.Windows.Controls;    
namespace DPandMVVM
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
            DataContext = new UserControl1VM();
        }
    }
}

和视图模型 UserControl1VM.cs:

using System.Windows;    
namespace DPandMVVM
{
    public class UserControl1VM : DependencyObject
    {
        public UserControl1VM()
        {
            TextInControl = "TextfromUserControl1VM";
        }

        public string TextInControl
        {
            get { return (string)GetValue(TextInControlProperty); }
            set { SetValue(TextInControlProperty, value); }
        }

        public static readonly DependencyProperty TextInControlProperty =
            DependencyProperty.Register("TextInControl", typeof(string), typeof(UserControl1VM));
    }
}

对于此星座,无法在 MainWindow.xaml 中找到 DP。

我究竟做错了什么?


First所有你想要的 DependencyPropertyTextInControl内声明UserControl1如果你想从外部绑定它。

将 DP 声明移至UserControl1.

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    public string TextInControl
    {
        get { return (string)GetValue(TextInControlProperty); }
        set { SetValue(TextInControlProperty, value); }
    }

    public static readonly DependencyProperty TextInControlProperty =
        DependencyProperty.Register("TextInControl", typeof(string), 
                                       typeof(UserControl1));
}

Second您已从外部将 UserControl 的 DataContext 设置为UserControl1VM,

    public UserControl1()
    {
        InitializeComponent();
        DataContext = new UserControl1VM(); <-- HERE (Remove this)
    }

所以WPF绑定引擎寻找属性Text in UserControl1VM代替MainWindowVM。删除设置 DataContext 并将 UserControl1 的 XAML 更新为:

<UserControl x:Class="DPandMVVM.UserControl1"
             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="300" d:DesignWidth="300"
             x:Name="userControl1">
    <Grid>
        <TextBlock Text="{Binding TextInTextBlock, ElementName=userControl1}" />  
    </Grid>
</UserControl>

使用绑定 DPElementName通过设置x:Name在用户控件上。


UPDATE

如果你想拥有ViewModel完好无损地UserControl,您必须更新 MainWindow 中的绑定。显式告诉 WPF 绑定引擎使用以下命令在 MainWindow 的 DataContext 中查找属性ElementName像这样的绑定:

<local:UserControl1 TextInControl="{Binding DataContext.Text,
                    ElementName=mainWindow}" />

为此你需要设置x:Name="mainWindow"在窗口根级别。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

绑定 UserControl 依赖属性和 MVVM 的相关文章

  • WPF 网格布局

    是否可以在 WPF 中使用 Grid 来设计类似的东西 设计列很容易 但是行呢 或者有没有更好的解决方案 比如另一个容器 将每个矩形想象为模块 GroupBox 创建一个包含两列的外部网格 在此网格中 放置另外两个网格 每列一个 这将导致所
  • WPF 无法从 url 检索 WebP 图像?

    我无法从网址检索图像 以前 在设置 HttpClient 标头之前 我根本无法连接到该站点 我可以从其他来源检索图像 但不能从这个特定来源检索图像 检索图像的代码 var img new BitmapImage img BeginInit
  • 如何访问另一个类的字段

    您好 我有一个带有 2 个窗口的 WPF C 应用程序 我正在尝试访问 public int myInt 在我的主窗口中从我的其他窗口 MainWindow myInt 3 智能感知甚至不允许我访问该变量 有人可以帮忙吗 您需要将其声明为s
  • Caliburn micro 处于无应用程序对象模式,就像在 AutoCAD dll 插件中一样

    我正在使用 Caliburn Micro 开发 WPF 应用程序 该应用程序的一些视图需要加载到 AutoCAD 环境中 AutoCAD 编程环境允许开发 AutoCAD 插件 dll 类型 并将其加载到 AutoCAD 环境中 由于 Au
  • 为基于架构的 XML 文件创建 WPF 编辑器

    这是场景 我们的服务器产品之一使用大型 XML 配置文件 该文件的布局相当好 并且针对 XSD 文件进行了验证 现在是时候构建一个配置 GUI 来维护这个文件了 我想深入研究 WPF 来完成它 我可以为每个配置部分布置一个单独的表单 每次向
  • WPF ComboBox 中具有本地化名称的枚举

    我有一个列出枚举的组合框 enum StatusEnum Open 1 Closed 2 InProgress 3
  • WPF应用程序,在打开窗口之前运行异步任务

    我遇到了一个问题 我需要在主窗口打开并显示之前运行异步任务 IE STAThread static void Main string args MainWindow window new MainWindow SplashScreen Sh
  • 如何在鼠标悬停时突出显示 MahApps.Metro 的图块?

    我刚刚发现了一个非常出色的 WPF UI 工具包 MahApps Metro 我创建了一个带有 MahApps Metro Controls Tile 类型的图块的窗口 当鼠标经过时 我无法找到突出显示图块的正确方法 你知道我该怎么做吗 我
  • OxyPlot 中日期时间轴上的不规则间隔

    我有一个 WPF 应用程序 其中使用 OxyPlot 来绘制图表 我不断地将点添加到图表中的线系列中 X 轴是日期时间轴 其间隔类型设置为秒 点不断添加到线系列中 当第一个点和最后一个点之间的时间跨度是特定的秒数时 我删除第一个点并使绘图无
  • 如何在 MVVM 中使用应用程序命令

    我想使用 ApplicationCommands Cut 复制 粘贴 保存 它们看起来很有趣 因为命令路由 键绑定以及某些控件使用它们的事实 我了解如何绑定到虚拟机上的中继 委托命令 但我似乎无法理解应用程序命令 我找到了一些旧的答案 但没
  • WPF:在 DependencyProperty.UnsetValue 上触发

    在回答中这个问题 https stackoverflow com questions 2596847 wpf applying a trigger on binding failure作出以下声明 理论上 可能 触发 x Static De
  • 何时引发 Window.SourceInitialized 事件

    我能保证Window SourceInitialized事件总是会在Window Loaded事件 我需要HwndSource在我的中进一步处理的对象Window Loaded 事件处理程序我不确定到那时这是否总是可用 以下是您可以预期的事
  • 如何在 C# 中将 Wpf BitmapSource 转换为 byte[] [重复]

    这个问题在这里已经有答案了 可能的重复 WPF 图像到字节 https stackoverflow com questions 553611 wpf image to byte 相对于此 https stackoverflow com qu
  • WPF TabControl的SelectedIndex设置问题

    我有一个包含两个项目的 TabControl
  • 在 WPF 树视图中获取 FullPath?

    如果我以编程方式创建 WPF TreeView 例如 TreeView treeView lt added in the designer TreeViewItem rootNode new TreeViewItem rootNode He
  • 如何在 WPF 中从原始帧渲染视频?

    我有一个特殊的摄像机 使用 GigEVision 协议 我使用提供的库进行控制 我可以订阅帧接收事件 然后通过 IntPtr 访问帧数据 在我的旧 WinForms 应用程序中 我可以通过从数据创建 Bitmap 对象并将其设置为 Pict
  • 默认转换器何时启动?

    使用以下代码 虽然 Text 属性绑定到 DateTime 源属性 但我注意到 WPF 似乎会自动将文本转换为 DateTime 而无需我编写 ValueConverter 有人可以解释一下这是如何完成的吗
  • 如何创建自动滚动文本框

    我有一个 WPF 应用程序 其中包含一个多行文本框 用于显示调试文本输出 如何设置文本框 以便将文本附加到框中时 它会自动滚动到文本框的底部 我正在使用 MVVM 模式 理想情况下 纯 XAML 方法会很好 TextBox 本身不一定是焦点
  • 如何使用 Google 的 GithubBrowserSample 方法在片段之间共享视图模型?

    我对 Android 架构组件的使用非常陌生 因此我决定使用 GithubBrowserSample 来构建我的应用程序来实现我的许多用例 但我有一个问题 我不知道使用这种方法在片段之间共享视图模型的正确方法是什么 我想共享视图模型 因为我
  • 与 wpf ComboBox DisplayMemberPath、SelectedValue 和 SelectedValuePath 混淆

    我一直在努力解决这些组合框属性 显示成员路径 选定值 选定的值路径 我正在构建一个主详细信息表单 组合框中充满了客户 用户在组合中选择客户 所有文本框 EG 均正确填写 我遇到的问题是我已经让它工作了 但我不理解这些属性和差异 有没有一个很

随机推荐

  • GStreamer 如何从流中提取视频帧?

    这是用于从服务器捕获流视频的 python 代码 但我需要编写一个函数来从流中提取一帧 这将是一个按钮 单击它将显示当前帧 我没有想法 谁能帮我这个 self player gst Pipeline player self source g
  • API网关自定义域证书错误

    我正在尝试使用自定义域设置区域 API 网关 但遇到了涉及 SSL 证书的问题 这是我所做的 使用 ACM 为vitalservices 3 docriot com 创建了证书 在API网关中 创建一个区域自定义域名 vitalservic
  • 传递到 ViewDataDictionary 的模型项的类型为 X[],但此 ViewDataDictionary 实例需要类型为 X 的模型项[重复]

    这个问题在这里已经有答案了 Error InvalidOperationException 传递到 ViewDataDictionary 的模型项的类型为 Test Models Ticket 但此 ViewDataDictionary 实
  • 即使没有从 HTML 到 PHP 检查,如何获取所有复选框变量?

    我注意到 PHP 似乎只返回选中复选框的值 我想查看复选框列表 而不仅仅是选中复选框的值 有没有办法检测未选中框的变量 我问这个问题是因为我希望能够更新设置 例如 我有一些已选中的选项 但如果用户决定取消选中某个选项 我需要知道该未选中的值
  • 使用 pyinstaller 创建可执行文件时出现分段错误:11

    最近 我创建了一个简单的 python 应用程序 其 GUI 是通过PyQt5图书馆 我已经多次测试了应用程序本身 一切正常 但是 在我尝试使用以下命令将其打包为可执行文件之后pyinstaller 运行生成的可执行文件不会创建 GUI 而
  • 有没有办法获取jQuery ajax上传进度?

    ajax xhr function var xhr new window XMLHttpRequest Upload progress xhr upload addEventListener progress function evt if
  • 如何向此自定义的facet_wrap 添加geom_quantile 图例?

    我最近得到了很大的帮助 https stackoverflow com questions 60655019 why does strip text color from facet wrap not correspond to eleme
  • Mono TLS1.2 问题 - btls-cert-sync“找不到命令”

    Summary 我的公司使用 TargetProcess TP 来跟踪开放项目的进度 并且我们创建了相对较小的代码来将更新导入到 TargetProcess 目前 在提交构建后 我们启动了一个预装了 Mono 的 debian docker
  • 找不到 gradle 3.0.0-alpha4

    几天前 我安装了 android studio 3 0 预览版 之后在稳定版本 studio 2 3 3 中 当我尝试导入项目时 它给了我一个错误 在预览中一切正常 这是一个错误 Error Could not find com andro
  • 访问 CriteriaBuilder 中的 REGEXP_LIKE 函数

    我有一个多标准表单 并使用 CriteriaBuilder 来构建 sql 对于本地联系人条件 我需要使用 regexp like 函数来搜索逗号分隔数字字符串中的数字字符串 即在字符串中搜索 234 例如 1234 2345 6789 2
  • 如何使用 ggplot2 设置图例 alpha

    我有一张风速与方向的图表 其中有大量的点 因此除了 color month 之外 我还使用 alpha I 1 20 这是代码示例 library RMySQL library ggplot2 con lt dbConnect wind l
  • Jersey,如何 POST JSON 对象列表?

    我正在使用 Jersey 1 11 在 Java 中构建 RESTful Web 服务 并且在实现使用 JSON 化实体列表的方法时遇到问题 单实例方法工作正常 我得到的错误是 Status 400 Bad Request The requ
  • Android 中的 PEM 到 PublicKey

    我见过很多类似的问题 但没有一个对我有用 我只是想将从服务器检索到的 PEM 格式的 RSA 公钥转换为PublicKey在安卓中 有人能指出我正确的方向吗 编辑 我已成功使用以下代码将 PEM 转换为 PublicKey 但在对消息进行编
  • .csproj 的平台特定 ItemGroup 适用于程序集引用,但不适用于内容包含?

    由于我们有三个显式 x86 和 x64 版本的程序集 因此我编辑了相应的 csproj 文件以使用 例如 如下所示的块
  • 在 OpenGL-ES 2.0 中渲染多个 2D 图像

    我是 OpenGL 新手 正在尝试学习 ES 2 0 首先 我正在开发一款纸牌游戏 需要渲染多个纸牌图像 我跟着这个http www learnopengles com android lesson four introducing bas
  • Redux 框架在插件中使用时不工作

    我将使用 redux 框架作为我的插件选项 它显示在管理面板中 我可以保存设置 我使用了选项面板的示例配置文件 所以问题是我没有通过打印全局来获取选项值opt name多变的 如果我将 redux 框架配置文件添加到主题functions
  • CSS/HTML:在输入字段周围创建发光边框

    我想为我的表单创建一些像样的输入 并且我真的很想知道 TWITTER 如何在输入周围制作发光边框 Twitter 边框示例 图片 我也不太知道如何创建圆角 干得好 glowing border border 2px solid dadada
  • Eclipse:如何有选择地禁用某些注释中的拼写检查

    我使用的是 Eclipse Kepler 版本 如何禁用评论内的拼写检查 我确实看到 窗口 首选项 常规 编辑器 文本编辑器 拼写 但此表没有关于禁用注释内拼写检查的选项 理想情况下 我想禁用特定评论的拼写检查 在其他地方 拼写检查注释可能
  • 如何在 pygame 中进行二段跳?

    有人可以帮我调试我的代码吗 因为我不明白为什么我不能让我的角色用多个空格键进行双跳 当我运行脚本时 我可以向上 向下 向左 向右移动 但是一旦我按一次空格键 对象就会飞出窗口 问题出在这个 if 语句上 所以我猜测这个 if 语句会继续运行
  • 绑定 UserControl 依赖属性和 MVVM

    我有一个包含 UserControl 的 MainWindow 两者都以 MVVM 模式实现 MainWindowVM 具有我想要绑定到 UserControl1VM 中的属性的属性 但这行不通 这是一些代码 视图模型使用某种 mvvm 框