将用户控件属性绑定到自定义类

2024-01-30

在我的应用程序中我使用的是usercontrol称为“ChannelControls”,我在主窗口上实例了 6 次。

public partial class ChannelControls : UserControl
{
    CMiXData cmixdata = CMiXData.Instance;
    public ChannelControls()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    public static readonly DependencyProperty ChannelSpriteCountProperty =
    DependencyProperty.Register("ChannelSpriteCount", typeof(string), typeof(ChannelControls), new PropertyMetadata("1"));
    [Bindable(true)]
    public string ChannelSpriteCount
    {
        get { return (string)this.GetValue(ChannelSpriteCountProperty); }
        set { this.SetValue(ChannelSpriteCountProperty, value); }
    }

我正在使用一个名为 cmixdata 的自定义类来保存我的应用程序的所有数据(它将包含不同的属性List字符串、双精度等...)。这ChannelControlswill 包含许多滑块、按钮和其他用户控件,但目前我正在尝试仅绑定其中之一。

这是这个自定义类的一部分,它将保存数据,它有一个私有构造函数,因为我需要从任何地方访问它:

[Serializable]
public class CMiXData : INotifyPropertyChanged
{
    private static CMiXData _instance = null;
    public static CMiXData Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new CMiXData();
            }
            return _instance;
        }
    }
    private CMiXData() { } //prevent instantiation from outside the class


    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
        MessageBox.Show(propertyName);
    }


    private List<string> _SpriteCount = new List<string>(new string[] {"1", "1", "1", "1", "1", "1"});
    public List<string> SpriteCount
    {
        get { return _SpriteCount; }
        set
        {
            if(_SpriteCount != value)
            {
                _SpriteCount = value;
                RaisePropertyChanged("SpriteCount");
            }
        }
    }

这是我尝试绑定通道控制属性的方法ChannelSpriteCount到我的单例类:cmixdata。

<CMiX:ChannelControls x:Name="Layer0" Tag="0" Visibility="Visible" ChannelSpriteCount="{Binding SpriteCount[0], Mode=TwoWay}"/>

在主用户控件上,ChannelControls被实例化后,datacontext是这样设置的:

public partial class CMiX_UI : UserControl
{
    BeatSystem beatsystem = new BeatSystem();
    CMiXData cmixdata = CMiXData.Instance;

    public CMiX_UI()
    {
        InitializeComponent();
        this.DataContext = cmixdata;
    }

在 xaml 方面:

<UserControl
        x:Class="CMiX.CMiX_UI"
        DataContext="{x:Static CMiX:CMiXData.Instance}"

但由于某种原因,cmixdata 中的属性没有更新,并且始终具有默认值......


UserControl 永远不应该拥有“自己的”视图模型实例。相反,它应该具有绑定到“外部”视图模型的属性的依赖属性。

你的 ChannelsControl 会声明一个像这样的属性(我想string不是一个合适的类型count):

public partial class ChannelsControl : UserControl
{
    public static readonly DependencyProperty SpriteCountProperty =
        DependencyProperty.Register(
            nameof(SpriteCount), typeof(string), typeof(ChannelsControl));

    public string SpriteCount
    {
        get { return (string)GetValue(SpriteCountProperty); }
        set { SetValue(SpriteCountProperty, value); }
    }

    ...
}

在 ChannelsControl 的 XAML 中,您可以像这样绑定它:

<CMiX:Counter Count="{Binding SpriteCount,
                      RelativeSource={RelativeSource AncestorType=UserControl}}"/>

现在,您将使用如下所示的 UserControl,其中将 Count 属性绑定到 DataContext 中的视图模型,如下所示:

<Window.DataContext>
    <local:CMiXData />
</Window.DataContext>
...

<local:ChannelsControl SpriteCount="{Binding SpriteCount[0]}" ... />

您现在还可以在 ItemsControl 的 ItemTemplate 中使用 ChannelsControl,如下所示:

<ItemsControl ItemsSource="{Binding SpriteCount}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <local:ChannelsControl SpriteCount="{Binding}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

编辑:将窗口的 DataContext 设置为视图模型单例实例,如下所示:

<Window ... DataContext="{x:Static local:CMiXData.Instance}" >

或者在后面的代码中,在 MainWindow 构造函数中:

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

将用户控件属性绑定到自定义类 的相关文章

随机推荐

  • 为特定风格和 buildType 定义 buildconfigfield

    我有两种口味 比如说香草和巧克力 我还有 调试 和 发布 构建类型 并且我需要 Vanilla Release 的字段为 true 而其他 3 个组合应该为 false def BOOLEAN boolean def VARIABLE VA
  • 检测 window.location 的变化

    我正在尝试检测 window location 中的更改 例如 如果用户尝试重新加载页面 则会收到通知 但我似乎找不到方法来做到这一点 有一些与之相关的事件吗 Thanks The unload当用户离开页面时触发该事件 还有一个befor
  • 异步/同步 JavaScript

    我在理解异步和同步 Javascript 之间的区别时遇到了一些困难 希望有人能对此有所了解 我知道 Javascript 本质上是同步的 但您可以使用异步事件 回调来改变程序流程 但是 如果您调用包含 AJAX 且没有回调的函数 会发生什
  • 通过 url 将参数传递给 python azure 函数

    我试图通过 azure 函数使 hello world 示例适用于 python 基本函数尝试通过 url 检索输入的名称 然后响应 Hello Name 事实证明 通过天蓝色门户提供的示例模板不能开箱即用 基本示例如下所示 import
  • 在 SwiftUI 中根据宽度计算每行的项目数

    这是我之前问题的延伸 在 SwiftUI 中使用获取视图的宽度 https stackoverflow com questions 57577462 get width of a view using in swiftui 57591483
  • apache 到 tomcat:mod_jk 与 mod_proxy

    使用有什么优点和缺点mod jk and mod proxy用 apache 来处理 tomcat 实例 我多年来一直在生产中使用 mod jk 但我听说这是前端 tomcat 的 旧方法 我应该考虑改变吗 会有什么好处吗 这些模块的优缺点
  • 触摸屏平板电脑上的 WPF Scrollviewer

    我正在编写一个 WPF 应用程序 它将在完整的 Windows 8 触摸屏平板电脑 而不是 RT 上运行 但是触摸滚动似乎不起作用 所以我想知道我是否做错了什么或者是否有可能 所以 我有一个带有滚动查看器的 WPF 窗口 在该滚动查看器中
  • pandas 3x3 散点矩阵缺少标签

    我使用以下代码创建一个 pandas 散点矩阵 import numpy as np import pandas as pd a np random normal 1 3 100 b np random normal 3 1 100 c n
  • Jenkins 环境变量在构建后步骤中可用

    据我所知 Jenkins 在构建执行期间设置了某些环境变量 但我的问题是我可以在构建后脚本中访问这些变量吗 我进行了快速测试 但无法从构建后步骤 python 脚本访问 PROJECT NAME 和 BUILD URL 等 有没有办法可以从
  • 如何在linq中直接执行SQL查询

    在 C 和 VS 2008 中 我有一个查询 在这个查询中我连接了多个表 所以我不知道类型 我想知道如何在 linq 中直接运行 sql 查询 IEnumerable
  • tomcat中connectionTimeout的含义

    这个参数对于tomcat来说意味着什么 它被宣布于server xml如下
  • OpenCV K 均值 (kmeans2)

    我正在使用 Opencv 的 K means 实现来对一大组 8 维向量进行聚类 它们聚类得很好 但我找不到任何方法来查看聚类过程创建的原型 这可能吗 OpenCV 似乎只提供对集群索引 或标签 的访问 如果没有 我想是时候自己实现了 我不
  • 为什么我可以在 constexpr 函数内调用非 constexpr 函数?

    考虑以下代码 include
  • AccessibilityService - PerformGlobalAction 无法在自己的应用程序中工作

    我正在尝试通过发送系统返回新闻事件AccessibilityService这工作正常 但前提是我不在自己的应用程序中 我总是得到true from performGlobalAction无论我是否在自己的应用程序中 但只有当我不在自己的应用
  • 在可排序 UI 中制作表格行向上移动的动画

    我使用 Sortable jQuery UI 来允许用户拖放表行 这允许用户根据自己的偏好对表中的项目进行排名 用户完成对列表的排序后 他们按下保存按钮 该按钮将执行 Ajax 调用 新排名将保存到数据库中 并且表格会简要突出显示 我现在添
  • Rebus 和远程队列

    我正在使用画笔画 https github com rebus org https github com rebus org v 0 83 到目前为止 它都是在一台机器上进行的 现在我需要使用从我的网站到应用程序服务器的远程队列 我不太清楚
  • 适用于 Windows 的 LLVM C++ IDE

    是否有一些适用于 Windows 的 C C IDE 融合的使用 LLVM 编译器 和 Clang C C 分析器 就像现代 Xcode 一样 我有 Dev Cpp 它使用过时的 GCC 并且代码 块 https en wikipedia
  • db2 中批量更新比单次更新快吗?

    我有一个包含 10 列的表 该表中有数千 数百万行 在某些情况下 我想一次更新超过 10K 条记录 目前我的场景代码按顺序工作 for i in primary key ids for all records to be updated e
  • 在 Mercurial 中回滚多个提交(在推送到公开之前)

    我知道回滚可以从本地存储库中的最新变更集中删除提交 但是 是否可以删除自上次推送以来的所有最新提交 而无需重新克隆共享存储库 您可以使用hg strip命令的一部分mq扩大 hg strip REV 这将删除该修订及其所有后代 在尝试此操作
  • 将用户控件属性绑定到自定义类

    在我的应用程序中我使用的是usercontrol称为 ChannelControls 我在主窗口上实例了 6 次 public partial class ChannelControls UserControl CMiXData cmixd