DataGrid DataGridTemplateColumn 组合框

2024-01-07

我的方法有问题ComboBoxes in a DataGrid,我用几张图来解释一下。

这是起点。

现在,如果我想添加新行,我单击最后一行并按 Enter 键。

添加一个新行,并在此处选择类型表并为其命名为 MY_TABLE,然后按 Enter 键添加另一行。

结果是这样的,之前添加的行类型选择的组合框又回到了“无”。NOTE:复选框之前呈灰色,因为类型 None 不能拥有任何权限,但表可以拥有CRUD所以当我选择类型表时它们就被启用了。

这里是ViewModel (VM)对于每一行:

public class RoleHasPrivilegeOnObjectEntityViewModel : EntityViewModelBase<RoleHasPrivilegeOnObjectEntityViewModel, RoleHasPrivilegesOnObject>, IRoleHasPrivilegeOnObjectListItemViewModel
{
    private readonly RoleHasPrivilegesOnObject _roleHasPrivilegesOnObject;
    private ObservableCollection<ObjectTypeEntityViewModel> _availableObjectTypes;
    private readonly ObjectTypeEntityViewModel _objectTypeEntityViewModel;
    private IRoleEntityViewModel _role;
    private IObjectEntityViewModel _object;

    public RoleHasPrivilegeOnObjectEntityViewModel(RoleHasPrivilegesOnObject roleHasPrivilegesOnObject, IEnumerable<OBJECT_TYPE> availableObjectTypes)
    {
        _roleHasPrivilegesOnObject = roleHasPrivilegesOnObject;
        AvailableObjectTypes = new ObservableCollection<ObjectTypeEntityViewModel>(availableObjectTypes.Select(ot => new ObjectTypeEntityViewModel(ot)));
        _role = new RoleEntityViewModel(_roleHasPrivilegesOnObject.Role);
        _object = new ObjectEntityViewModel(_roleHasPrivilegesOnObject.Object);
        _objectTypeEntityViewModel = new ObjectTypeEntityViewModel(_roleHasPrivilegesOnObject.Object.OBJECT_TYPE);
    }

    public RoleHasPrivilegeOnObjectEntityViewModel(XROLE role, CONTAINER schema, OBJECT_TYPE currentObjectType, IEnumerable<OBJECT_TYPE> availableObjectTypes)
    {
        var objectTypes = availableObjectTypes as IList<OBJECT_TYPE> ?? availableObjectTypes.ToList();
        _roleHasPrivilegesOnObject = new RoleHasPrivilegesOnObject(role,
                                      new XOBJECT { CONTAINER = schema, OBJECT_TYPE = currentObjectType },
                                      new List<OBJECT_HAS_PRIVILEGE>(),
                                      objectTypes.SelectMany(aot => aot.PRIVILEGE));
        AvailableObjectTypes = new ObservableCollection<ObjectTypeEntityViewModel>(objectTypes.Select(ot => new ObjectTypeEntityViewModel(ot)));
        _role = new RoleEntityViewModel(_roleHasPrivilegesOnObject.Role);
        _object = new ObjectEntityViewModel(_roleHasPrivilegesOnObject.Object);
        _objectTypeEntityViewModel = new ObjectTypeEntityViewModel(_roleHasPrivilegesOnObject.Object.OBJECT_TYPE);
    }

    public override EntityType EntityType
    {
        get { return SelectedObjectType.EntityType; }
    }

    public ObjectTypeEntityViewModel SelectedObjectType
    {
        get { return _objectTypeEntityViewModel; }
        set
        {
            _roleHasPrivilegesOnObject.Object.OBJECT_TYPE = value.OriginalEntity;
            OnPropertyChanged();
            OnPropertyChanged("CanHaveSelect");
            ...
        }
    }

    public ObservableCollection<ObjectTypeEntityViewModel> AvailableObjectTypes
    {
        get { return _availableObjectTypes; }
        set
        {
            _availableObjectTypes = value;
            OnPropertyChanged();
        }
    }        

    public string ToolTip
    {
        get { return _roleHasPrivilegesOnObject.ToolTip; }
    }

    public bool HasSelect
    {
        get { return _roleHasPrivilegesOnObject.HasSelect; }
        set
        {
            _roleHasPrivilegesOnObject.HasSelect = value;
            OnPropertyChanged();
        }
    }

    public bool CanHaveSelect
    {
        get
        {
            var canHaveSelect = _roleHasPrivilegesOnObject.CanHaveSelect;
            if(!canHaveSelect && HasSelect) HasSelect = false;
            return canHaveSelect;
        }
    }

    ...

    public override string NAME
    {
        get { return _roleHasPrivilegesOnObject.NAME; }
        set
        {
            _roleHasPrivilegesOnObject.NAME = value;
            OnPropertyChanged();
            OnPropertyChanged("Text");
        }
    }
}

这是我的View为了DataGrid

<UserControl ...
             d:DataContext="{d:DesignInstance impl:PrivilegeDetailsViewModel}">
    <UserControl.Resources>

        <Style x:Key="DataGridContentCellCentering" TargetType="{x:Type DataGridCell}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridCell}">
                        <Grid Background="{TemplateBinding Background}">
                            <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <Style x:Key="CanHaveSelectStyle" TargetType="CheckBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding CanHaveSelect, UpdateSourceTrigger=PropertyChanged}" Value="True">
                    <Setter Property="IsEnabled" Value="True"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding CanHaveSelect, UpdateSourceTrigger=PropertyChanged}" Value="False">
                    <Setter Property="IsEnabled" Value="False"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>

        ...

    </UserControl.Resources>
    <DataGrid x:Name="PrivilegeDataGrid"
              ItemsSource="{Binding RolesHasPrivilegesOnObjects}" 
              AutoGenerateColumns="False"
              CanUserReorderColumns="False"
              CanUserResizeColumns="True"
              CanUserResizeRows="False"
              CanUserSortColumns="True"
              CanUserAddRows="True"
              IsTextSearchEnabled="True"
              BorderThickness="0">
        <DataGrid.Columns>

            <DataGridTemplateColumn Header="Type" CanUserSort="True" MinWidth="120">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate DataType="{x:Type impl2:RoleHasPrivilegeOnObjectEntityViewModel}">
                        <ComboBox ItemsSource="{Binding AvailableObjectTypes}"
                                  SelectedItem="{Binding SelectedObjectType}"
                                  SelectedValue="{Binding SelectedObjectType.ID}"
                                  SelectedValuePath="ID">
                            <ComboBox.ItemTemplate>
                                <DataTemplate DataType="{x:Type impl2:ObjectTypeEntityViewModel}">
                                    <StackPanel Orientation="Horizontal">
                                        <Image Source="{Binding Icon}" ToolTip="{Binding ToolTip}" Margin="0,0,3,0" Width="17" Height="17"/>
                                        <TextBlock Text="{Binding ToolTip}"/>
                                    </StackPanel>
                                </DataTemplate>
                            </ComboBox.ItemTemplate>
                        </ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTextColumn Width="*" Header="Name" Binding="{Binding NAME}">
                <DataGridTextColumn.EditingElementStyle>
                    <Style TargetType="TextBox">
                        <Setter Property="extensions:TextBoxUpperCaseBehavior.IsEnabled" Value="True"/>
                    </Style>
                </DataGridTextColumn.EditingElementStyle>
            </DataGridTextColumn>

            <DataGridCheckBoxColumn Header="Select" 
                                    Binding="{Binding HasSelect, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                                    CellStyle="{StaticResource DataGridContentCellCentering}"
                                    ElementStyle="{StaticResource CanHaveSelectStyle}"
                                    EditingElementStyle="{StaticResource CanHaveSelectStyle}" />
            ...

        </DataGrid.Columns>
    </DataGrid>
</UserControl>

我已经尝试过所有这些变体ComboBox ItemsSource and SelectedItem

<ComboBox ItemsSource="{Binding AvailableObjectTypes}"
          SelectedItem="{Binding SelectedObjectType}"
          SelectedValue="{Binding SelectedObjectType.ID}"
          SelectedValuePath="ID">

<ComboBox ItemsSource="{Binding AvailableObjectTypes}"
          SelectedValue="{Binding SelectedObjectType.ID}"
          SelectedValuePath="ID">

<ComboBox ItemsSource="{Binding AvailableObjectTypes}"
          SelectedItem="{Binding SelectedObjectType}"
          SelectedValuePath="ID">

<ComboBox ItemsSource="{Binding AvailableObjectTypes}"
          SelectedItem="{Binding SelectedObjectType}">

我需要做什么才能使ComboBox表现如预期吗?


看似简单的一个UpdateSourceTrigger上缺少属性SelectedObjectType结合在xaml为了ComboBox, 像这样

<ComboBox ItemsSource="{Binding AvailableObjectTypes}"
          SelectedItem="{Binding SelectedObjectType, UpdateSourceTrigger=PropertyChanged}"
          SelectedValue="{Binding SelectedObjectType.ID}"
          SelectedValuePath="ID">
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DataGrid DataGridTemplateColumn 组合框 的相关文章

  • 将 WPF 快捷键绑定到 ViewModel 中的命令

    我有一个使用 MVVM 模式的 WPF 应用程序 将按钮连接到 VM 非常简单 因为它们实现了 ICommand 我有一个工作原理类似的上下文菜单 下一步是为上下文菜单创建快捷键 我不知道如何让快捷键调用命令 这是一个例子
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • 无法使用 DialogResult

    我尝试使用DialogResult检查一个Messagebox s 是 否 取消 我正在使用以下代码 我没有看到任何问题 DialogResult dlgResult MessageBox Show Save changes before
  • WPF HierarchicalDataTemplate 不会在属性更改时更新 ItemsSource

    这是一些 XAML
  • 比较运算符性能 <= 与 !=

    让我们首先声明代码可读性胜过微优化 我们应该将其留给编译器 这只是一个奇怪的案例 具体细节似乎与一般建议相比很有趣 因此 我在搞素数生成器函数 并提出了一种奇怪的行为 其中 人们建议效率最高 实际上效率最低 而 C private stat
  • 更改鼠标悬停时的矩形背景

    所以我有一个没有背景的矩形 当用户将鼠标悬停在其上时 我想给它一个背景渐变 然后当鼠标离开矩形时删除渐变 请有人发布所需的代码 并告诉我将其放在 cs xaml 文件中的位置吗 Thanks This
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 如何在运行时添加到 TreeView 目录

    我有一个TreeView我想允许用户添加和删除子项目 在探索基本功能时 我使用button and a textbox添加此子项 当用户点击button a new TreeViewItem需要创建并设置为我的父项的子项TreeView与t
  • 带动态元素的 WPF 启动屏幕。如何?

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

    我在将命令绑定到复合集合中的菜单项时遇到问题 这MenuItem是其一部分ContextMenu这是定义在UserControl Resources 问题是新标签的绑定不起作用 当我将 MenuItem 放置在复合集合之外时 它将起作用 有
  • 需要“依赖属性”的简短而清晰的定义

    我试图弄清楚依赖属性到底是什么 但是当我在任何地方寻找定义时 我只找到 如何使用 而不是 它是什么 想象一下 您在面试时被问到 什么是依赖属性 你的答案是什么 DependencyProperty 是一个属性 其值取决于 或可以取决于 某些
  • .NET / C# / WPF 项目的命名约定

    NET C WPF 项目广泛接受的命名约定是什么 Microsoft 有一篇关于命名约定的内容广泛的 MSDN 文章here http msdn microsoft com en us library ms229002 aspx
  • 是什么导致 WPF 打印机输出被光栅化?

    我在 WPF 中遇到了许多打印问题 其中正在打印的特定项目组合会突然触发打印机输出的光栅化 导致打印机输出丑陋且庞大 并可能导致打印每页需要 30 秒 我发现在控件上设置任何级别的不透明度之类的事情通常会触发此问题 我忘记了它还有什么作用
  • Visual Studio 扩展找不到所需的程序集

    我为 Visual Studio 2013 编写了一个扩展 因为该死的组合框错误 https stackoverflow com questions 7800032 cancel combobox selection in wpf with
  • 解释 System.Diagnostics.CodeAnalysis.SuppressMessage

    我在某些应用程序中有这种代码 来自微软 assembly System Diagnostics CodeAnalysis SuppressMessage Microsoft Naming CA1702 CompoundWordsShould
  • 使用 ICollectionView 过滤 ObservableCollection

    I have ObservableCollection绑定到dataGrid现在我想过滤我看到需要使用的呈现数据ICollectionView但我不知道如何添加ICollectionView和我的MVVM图案 我的代码简化如下 public
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • 元素属性语法和属性属性语法之间有语义差异吗?

    我认为元素属性语法和属性属性语法在语义上没有太大区别 但是 我发现一定有什么不同 例如 下面的例子只是演示了一个简单的触发器
  • Windows Phone 8.1 ComboBox 在项目数量较多时显示多个项目

    当组合框中有更多项目时 组合框将显示列表选择器弹出按钮 如果我选择第一个并向下滚动 则多个项目将显示为选定的 但 ComboBox 的 SelectedItem 将是我选择的项目 我修改了ListPickerFlyout的样式 并关闭了Li
  • 主从视图中聚合详细信息值

    我在一些自定义实体中有主从关系 假设我有以下结构 class Master INotifyPropertyChanged public int Id get set property changed implementation publi

随机推荐

  • 以 Y-m-d 格式转换 cakephp 3 的时间对象

    我正在 cakephp 3 中工作 我想以 Y m d 格式打印我的时间对象 这是我的对象 expiry gt object Cake I18n Time time gt 2015 07 31T00 00 00 0000 timezone
  • 上下文操作模式不过滤触摸

    当上下文操作模式覆盖在 android support v7 widget Toolbar 顶部时 似乎不会过滤其整个宽度上的触摸 而是让触摸 落入 工具栏上的 不可见 小部件 我的工具栏包含一个自定义小部件 工具栏宣称的优点之一 我将上下
  • 如何更改seaborn.catplot中的标记大小

    所以我有这段代码可以生成一个图 g sns catplot data public x age y number col species kind strip jitter True order order palette palette
  • 如何在 php-fpm-alpine docker 容器内运行 cron 作业?

    你好 我不知道如何在里面运行 cron 作业this https github com docker library php blob c88c3d52f41a370f3a62e3ded62b7b223b4cb846 7 2 alpine3
  • 在上下文加载之前无法在 spring 中发布自定义事件

    我正在尝试在 Spring MVC 中发布自定义事件 但在加载上下文时不会触发 下面是代码片段 onConnectionOpened 将在连接到服务器后调用 该服务器在使用 PostConstruct 初始化 bean 后触发 Autowi
  • Node.js - 在管道响应之前检查流是否有错误

    在 Node js 中 假设我想从某处读取文件并流式传输响应 例如 从文件系统使用fs createReadStream application get files id function request response var read
  • powershell中的换行符不显示在记事本中

    如果我用记事本打开 test txt 它是一行 两个 测试 之间没有换行符 但如果我用 vim 或 ultraedit 打开它 我可以看到换行符 什么原因 Set Content test txt test n ntest update t
  • 时间:2019-05-17 标签:c#RegistrySystem.Byte[]tostring

    我目前正在编写一个程序 该程序将读取部分 Windows 系统注册表 但是这些键的某些值是 System Byte 类型 当我尝试解码这些值时 我可以生成一个包含一些可读字符的字符串 该字符串使但大多数字符串都是乱码 我尝试了几种编码类型
  • 如何将 wchar_t** 转换为 char**?

    我得到 argv 作为 wchar t 见下文 因为我需要使用 unicode 但我需要将其转换为 char 我怎样才能做到这一点 int wmain int argc wchar t argv 有不止一种方法可以做到这一点 根据您的环境和
  • C++ dll 的 C# 包装器; “运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。”错误

    下面是 C dll 中的代码 extern C declspec dllexport int testDelegate int addFunction int int int a int b int res addFunction a b
  • 在 PhpStorm 中调试项目

    我一直在网络和 StackOverflow 上寻找满意的答案 但没有成功 我应该如何使用 Magento 作为整个应用程序 而不是单个文件 进行调试PhpStorm集成开发环境 https www jetbrains com phpstor
  • 如何在Python中进行scp?

    在 Python 中 scp 文件的最 Pythonic 方法是什么 我知道的唯一路线是 os system scp s s s localfile remotehost remotefile 这是一种 hack 在类似 Linux 的系统
  • 根据名称中的模式更新列对

    这是我的数据框 col 1 lt c 1 2 NA 4 5 temp col 1 lt c 12 2 2 3 4 col 2 lt c 1 23 423 NA 23 temp col 2 lt c 1 2 23 4 5 df test lt
  • 为什么有些窗口收不到Windows消息

    在 Visual Studio 上使用 Spy 工具 我可以看到桌面或资源管理器 文件资源管理器 等窗口接收 WM 消息 但 Firefox 或 Visual Studio 等窗口不接收消息 为什么有的人能收到消息 有的人却收不到 通过 W
  • 从用户工作区加载类

    我正在编写一个 Eclipse 插件 它应该显示枚举类的一些信息 新视图应显示所有枚举常量和分配的值 枚举值以某种方式在构造函数中计算 并且在编辑器中并不明显它们在运行时将具有哪个值 这就是该插件的动机 我尝试访问由 eclipse AST
  • Java 多线程客户端/服务器 - java.net.SocketException:套接字已关闭

    我必须使用 Java 的套接字 api 编写多线程客户端和服务器 客户端和服务器都是多线程的 因此服务器可以处理多个连接 客户端可以测试服务器处理连接的能力 我的代码在这里 https github com sandyw Simple Ja
  • 如何检查 php://input 是否设置?

    我需要检查是否php input存在 设置 它可以与 PHP 一起使用吗isset https php net isset 正确的检查方法是什么 尝试用以下方法测试它file get contents http php net file g
  • 确定是否存在至少一行具有给定条件的行

    Employee 表有 ID 和 NAME 列 名称可以重复 我想查明是否至少有一行名称为 kaushik 所以查询应该返回 true false 或 1 0 是否可以使用单个查询找到它 如果我们尝试类似的事情 select count 1
  • 如何在 Tomcat 的 META-INF/context.xml 中指定路径

    我正在使用 Tomcat 7 希望在 war 文件本身中设置 war 文件的上下文根 并让 Tomcat 自动部署并选择此路径 我想我找到了通过将 context xml 放入包含的 war 的 META INF 目录中来做到这一点的方法
  • DataGrid DataGridTemplateColumn 组合框

    我的方法有问题ComboBoxes in a DataGrid 我用几张图来解释一下 这是起点 现在 如果我想添加新行 我单击最后一行并按 Enter 键 添加一个新行 并在此处选择类型表并为其命名为 MY TABLE 然后按 Enter