关于c#:BindingProxy:绑定到索引属性

我有一个BindingProxy将DataGrid的DataGridColumns的可视性-属性绑定到字典中的值(" ColumnsVisibility")。我也有一个上下文菜单,它应该可以隐藏/显示网格的列。

<DataGrid Name="dgMachines"ItemsSource="{Binding HVMachineList,UpdateSourceTrigger=PropertyChanged}"                  AutoGenerateColumns="False"><DataGrid.Resources><local:BindingProxy x:Key="proxy" Data="{Binding}"/><ContextMenu x:Key="DataGridColumnHeaderContextMenu"><MenuItem Header="Names"><CheckBox Content="Name" IsChecked="{Binding Data.ColumnsVisibility[ElementName], Source={StaticResource proxy}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/></MenuItem></ContextMenu></DataGrid.Resources><DataGrid.Columns><DataGridTextColumn Header="Name" Binding="{Binding ElementName}" Visibility="{Binding Data.ColumnsVisibility[ElementName], UpdateSourceTrigger=PropertyChanged, Source={StaticResource proxy}, Converter={StaticResource BoolToVisibilityConv},  Mode=TwoWay}" />                </DataGrid.Columns>
</DataGrid>

如果在InitializeComponent()之前用信息填充了字典" ColumnsVisibility",则将应用初始设置,即应用了我将DictionaryEntry设置为的值。

我的目标是选中上下文菜单中的复选框,然后列会出现/消失。因为ContextMenu和Columns不是与DataGrid或其他所有对象相同的可视树的成员,所以我使用的是Proxy。
我的问题是,在ContextMenu中选中/取消选中CheckBox不会更改ColumnsVisibility [ElementName]的值。如果将check / uncheck-Event添加到Checkbox,则可以在代码中使用它来更改它,但是触发PropertyChanged-Event不会改变任何视觉效果。该列保持原样。

indingProxy是否将事件转发到GUI,反之亦然?目前看来还没有。
任何人都有一个想法如何解决这个问题?

编辑:
BindingProxy:

public class BindingProxy : Freezable
{#region Overrides of Freezableprotected override Freezable CreateInstanceCore(){return new BindingProxy();}#endregionpublic object Data{get { return (object)GetValue(DataProperty); }set { SetValue(DataProperty, value); }}// Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...public static readonly DependencyProperty DataProperty =DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}

编辑2:
ColumnsVisibilty属性

private Dictionary<string, bool> _ColumnsVisibility = new Dictionary<string, bool>();
public Dictionary<string, bool> ColumnsVisibility{get{return(_ColumnsVisibility);}set{  _ColumnsVisibility = value;if (PropertyChanged != null)PropertyChanged(null, new PropertyChangedEventArgs("ColumnsVisibility"));}}

在InitializeComponent()之前,这是在加载时完成的:

1

_ColumnsVisibility.Add("ElementName", false);

编辑3
好的,这是完整的源代码:
互动逻辑:

using System.Collections.Generic;
using System.Security;
using System.Windows;
using System.Windows.Controls;
using System.Collections.ObjectModel;
using System.ComponentModel;namespace HyperV
{
/// <summary>
/// Interaction logic for HyperVControl.xaml
/// </summary>
public partial class HyperVControl : UserControl, INotifyPropertyChanged
{public HyperVControl(){            #region Set default visibility for Columns_ColumnsVisibility.Add("ElementName", false);//(...)#endregionInitializeComponent();}#region Control triggeredprivate void UserControl_Loaded(object sender, RoutedEventArgs e){}/// <summary>/// Is Triggered by Checkboxes, that are in the contextmenu of the DataGrid-Header to show/hide columns/// </summary>/// <param name="sender">The Checkbox, that send this command</param>/// <param name="e"></param>private void CheckBox_Checked(object sender, RoutedEventArgs e){//This sets the value in ColumnsVisibility to be sure. The value is NOT set by binding (but should...)ColumnsVisibility[((CheckBox)sender).Tag.ToString()] = (bool)((CheckBox)sender).IsChecked;//Nothing of this worksif (PropertyChanged != null){PropertyChanged(null, new PropertyChangedEventArgs("ColumnsVisibility"));PropertyChanged(null, new PropertyChangedEventArgs("ColumnsVisibility[Machinename]"));PropertyChanged(null, new PropertyChangedEventArgs("Data.ColumnsVisibility"));PropertyChanged(null, new PropertyChangedEventArgs("Data.ColumnsVisibility[Machinename]"));}}#endregion#region Properties (private and publics)      private ObservableCollection<HyperVMachine> _HVMachineList;      private Dictionary<string, bool> _ColumnsVisibility = new Dictionary<string, bool>();/// <summary>/// Contains all loaded information about the virtual Clients/// </summary>public ObservableCollection<HyperVMachine> HVMachineList{get { return _HVMachineList; }set{_HVMachineList = value;if (PropertyChanged != null)PropertyChanged(this, new PropertyChangedEventArgs("HVMachineList"));}}/// <summary>/// To set/// </summary>public Dictionary<string, bool> ColumnsVisibility{get{return(_ColumnsVisibility);}set{  _ColumnsVisibility = value;if (PropertyChanged != null)PropertyChanged(null, new PropertyChangedEventArgs("ColumnsVisibility"));}}#endregion#region Events//To Update Content on the Formpublic event PropertyChangedEventHandler PropertyChanged;        #endregion
}//Binding Proxy
#region Freezable for Context-Menu-Data-Transmition
public class BindingProxy : Freezable
{#region Overrides of Freezableprotected override Freezable CreateInstanceCore(){return new BindingProxy();}#endregionpublic object Data{get { return (object)GetValue(DataProperty); }set { SetValue(DataProperty, value); }}// Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...public static readonly DependencyProperty DataProperty =DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}
#endregion
}
<UserControl xmlns:Controls="clr-namespace:HyperV.Controls"  x:Class="HyperV.HyperVControl"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"xmlns:local="clr-namespace:HyperV"mc:Ignorable="d"d:DesignHeight="300" d:DesignWidth="900"Loaded="UserControl_Loaded"DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}"            >
<UserControl.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Language/language.xaml"/><ResourceDictionary Source="Language/language.de-DE.xaml"/></ResourceDictionary.MergedDictionaries><local:BoolToVisibilityConverter x:Key="BoolToVisibilityConv"/></ResourceDictionary>
</UserControl.Resources>
<Grid><DataGrid Name="dgMachines"ItemsSource="{Binding HVMachineList, UpdateSourceTrigger=PropertyChanged}"AutoGenerateColumns="False"                  ><DataGrid.Resources><local:BindingProxy x:Key="proxy" Data="{Binding}"/><ContextMenu x:Key="DataGridColumnHeaderContextMenu"><MenuItem Header="{StaticResource MenHeadGeneral}"><CheckBox Tag="ElementName" Content="{StaticResource MenMachinename}" IsChecked="{Binding Data.ColumnsVisibility[ElementName], Source={StaticResource proxy}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Checked="CheckBox_Checked" Unchecked="CheckBox_Checked"/>                        <!-- ... --></MenuItem><!-- ... --></ContextMenu><Style TargetType="{x:Type DataGridColumnHeader}"><Setter Property="ContextMenu" Value="{StaticResource DataGridColumnHeaderContextMenu}" /></Style></DataGrid.Resources><DataGrid.Columns><DataGridTextColumn Header="{StaticResource MenMachinename}" Binding="{Binding ElementName}" Visibility="{Binding Data.ColumnsVisibility[ElementName], UpdateSourceTrigger=PropertyChanged, Source={StaticResource proxy}, Converter={StaticResource BoolToVisibilityConv},  Mode=TwoWay}" />                <!-- ... --></DataGrid.Columns></DataGrid>
</Grid>
</UserControl>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/57202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

肯德尔秩相关系数(Kendall‘s Tau)排名

肯德尔秩相关系数&#xff08;Kendall’s Tau&#xff09;是一种用于衡量两个排列之间相似性的统计指标&#xff0c;它考虑了元素之间的顺序关系而不考虑具体数值。该系数被广泛用于排序、排名和比较不同实验结果的相关性等领域。 具体而言&#xff0c;肯德尔秩相关系数衡量了…

AUTOSAR从入门到精通-【应用篇】基于嵌入式实时Linux及AUTOSAR的跨平台技术研究与实现

目录 前言 通用实时操作系统的国内外研究现状 AUTOSAR国内外研究现状 实时操作系统的选择

专业制造一体化ERP系统,专注于制造工厂生产管理信息化,可定制-亿发

制造业是国民经济的支柱产业&#xff0c;对于经济发展和竞争力至关重要。在数字化和智能化趋势的推动下&#xff0c;制造业正处于升级的关键时期。而ERP系统&#xff0c;即企业资源计划系统&#xff0c;能够将企业的各个业务环节整合起来&#xff0c;实现资源的有效管理和信息的…

攻击与防御实战经验分享:分析真实的攻击事件和入侵行为,讨论防御方法和实践经验

章节 1: 前言 作为IT领域的从业者&#xff0c;我们时刻都面临着网络安全的挑战。攻击者不断寻找漏洞&#xff0c;而防御者则需要时刻保持警惕&#xff0c;采取最佳实践来保护系统和数据。在本文中&#xff0c;我们将分享一些真实的攻击事件和入侵行为&#xff0c;并探讨针对这…

LInux之chrony服务器

目录 场景 重要性 LInux的两个时钟 硬件时钟 系统时钟 NTP协议 Chrony介绍 定义 组成 --- chronyd和chronyc 安装与配置 安装 Chrony配置文件分析 同步时间服务器 chronyc命令 chronyc sources输出分析 其它命令 查看时间服务器的状态 查看时间服务器是否在线 …

大数据技术概述(三)——编程语言的选择

文章目录 1.6编程语言的选择1.6.1java和Scala1.6.2Python1.6.3SQL 1.6编程语言的选择 大数据编程一般会使用Java、Scala和python等编程语言&#xff0c;Flink目前也支持上述3种语言。 1.6.1java和Scala Java支持多线程&#xff0c;其生态圈中可用的第三方库众多。Java虚拟机…

如何解决索引分裂问题?

索引分裂 索引块快写满时就会发生索引分裂&#xff0c;索引分裂分为两种情况&#xff0c;55和91&#xff1a; 索引分裂和enq: TX - index contension等待事件的区别 无论是55还是91&#xff0c;都是数据增多后索引的正常行为&#xff0c;索引分裂是业务数据量增大导致索引增大…

③matlab向量和矩阵

目录 手动输入数组 创建等间距向量 数组创建函数 手动输入数组 1.背景 单个称为标量的数值实际上是一个 11 数组&#xff0c;也即它包含 1 行 1 列。 任务 创建一个名为 x 并且值为 4 的变量。 2.您可以使用方括号创建包含多个元素的数组。 x [3 5] x 3 5 任务 …

ubuntu创建自定义开机服务

创建启动脚本 如/usr/sbin/hikcam.sh 里面写要开机执行的命令 chmod 777 赋予权限 /lib/systemd/system下创建 .service文件 [Unit] Description"bringup hikcam" Afternetwork.target[Service] EnvironmentLD_LIBRARY_PATH/opt/MVS/lib/aarch64 Typesimple ExecS…

6、监测数据采集物联网应用开发步骤(5.2)

监测数据采集物联网应用开发步骤(5.1) 包含4个类数据库连接&#xff08;com.zxy.db_Self.ConnectionPool_Self.py&#xff09;、数据库操作类&#xff08;com.zxy.db_Self.Db_Common_Self.py&#xff09;、数据库管理类&#xff08;com.zxy.db_Self.DBManager_Self.py&#xf…

华为云Stack的学习(二)

三、华为云Stack产品组件 FunsionSphere CPS 提供云平台的基础管理和业务资源&#xff08;包括计算资源和存储资源&#xff09;。采用物理服务器方式部署在管理节点。可以做集群的配置&#xff0c;扩容和运维管理。 Service OM 提供云服务的运维能力&#xff0c;采用虚拟化方…

数据结构--树4.2.3(线索二叉树)

利用中序遍历可以解决二叉树中空出来的内存&#xff0c;以及前驱后继的问题。 lchildltagdatartagrchild ——ltag为0时指向该结点的左孩子&#xff0c;为1时指向该结点的前驱。 ——rtag为0时指向该结点的有孩子&#xff0c;为1时指向该结点的后继。 #include <stdio.h…

数字孪生:重塑制造、医疗和能源等领域的未来

数字孪生技术&#xff0c;作为虚拟仿真的重要领域&#xff0c;正以其强大的能力在各个行业中创造前所未有的创新。本文带大家一起深入探讨数字孪生技术在不同领域的广泛应用场景&#xff0c;展示其在实现效率、可靠性和智能化方面的积极影响。 制造业与工业领域 数字孪生技术在…

MyBatis分页插件PageHelper的使用及MyBatis的特殊符号---详细介绍

一&#xff0c;分页的概念 分页是一种将大量数据或内容分割成多个页面以便逐页显示的方式。在分页中&#xff0c;数据被分割成一定数量的页&#xff0c;每页显示一部分数据或内容&#xff0c;用户可以通过翻页或跳分页是一种将大量数据或内容分割成多个页面以便逐页显示的方式。…

MATLAB算法实战应用案例精讲-【概念篇】构建数据指标方法(补充篇)

前言 数据指标体系是指在数据分析领域中,为了评估和量化业务或项目的表现而建立的一组指标。这些指标可以用于监测和追踪业务或项目的发展情况,以便在需要时进行调整和改进。 数据指标体系通常包括多个方面,例如业务目标、数据采集、数据分析和报告等。在建立数据指标体系…

JavaScript—DOM(文档对象模型)

目录 DOM是什么&#xff1f; DOM有什么作用&#xff1f; 一、事件 理解事件 事件怎么写&#xff08;要做什么就写什么&#xff09;&#xff1f; 实战演练 1、页面加载完毕以后&#xff0c;打印一句话 2、如果有一个a标签&#xff0c;并给其添加一个点击事件 3、事件默…

1、监测数据采集物联网应用开发步骤(1)

项目介绍 本文章编写目的针对下图中《。。。解决方案》所涉及的开发资料&#xff1b; 监测数据采集物联网应用解决方案_yong427的博客-CSDN博客 开发步骤实现从0开始搭建软件框架&#xff0c;该开发步骤基于python3.0语言及相关工具实现&#xff0c;阅读本文章之前请先初步百…

React中的flushSync与Vue中的nextTick的比较

React中的flushSync与Vue中的nextTick是两种用于处理异步更新的机制。它们在React和Vue这两个流行的前端框架中起着重要的作用。 首先&#xff0c;让我们来看看flushSync。在React中&#xff0c;当需要更新UI时&#xff0c;React会将更新操作放入一个队列中&#xff0c;然后异…

特斯拉启动墨西哥建厂计划,引发台厂竞逐 | 百能云芯

特斯拉&#xff08;Tesla&#xff09;在墨西哥新工厂计划备受瞩目&#xff0c;据外媒报道&#xff0c;墨西哥的超级工厂似乎正在迈出实质性的步伐。包括鸿海集团、广达&#xff08;Foxconn&#xff09;、和大在墨西哥和美墨边境都计划扩大电动车零配件生产基地。 市场对特斯拉在…

LeetCode-406-根据身高重建队列

题目描述&#xff1a; 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造…