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 应用程序的代码隐藏中创建集合视图源

    我有以下代码 public partial class MainWindow Window public MainWindow InitializeComponent var entities new DemoEntities var de
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • 异步WCF调用来保存线程?

    In 另一个问题 https stackoverflow com q 19731600 279516 建议我发送异步网络请求 而不是在后台线程上发送同步请求 原因是为了不浪费一根线 我试图理解这是怎么回事 这是最初的做法 我可以理解这里怎么
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 具有依赖属性的值转换器

    我在实现自定义 DependencyObject 时遇到问题 我需要一个转换器来设置或取消设置绑定属性中的枚举标志 因此 我创建了一个从 FrameworkElement 派生的 IValueConverter 它具有两个 Dependen
  • 如何动态更新 ttk.combobox?

    我正在 Windows 8 计算机上使用 Python 3 4 和 Tkinter 创建 GUI GUI 顶部有一些条目输入 然后是一些组合框 我希望组合框从先前输入描述的文本文件中获取选项列表 文件名 找到必要信息的行 分隔符类型等 我正
  • 简单的WPF + MVVM绑定

    我有一个名为MyWindow源自于Window 我使用 MVVM 模式 因此在代码隐藏中我有以下字段 public MyViewModel ViewModel new MyViewModel ViewModel包含一个集合Person 我想
  • 怎么让画笔变得光滑,中间没有线条

    大家好 正如你在之前的画笔中看到的 中间有线条 不太顺利 如何使其平滑 如何删除该行 我用混合创建它
  • WPF 如何从 DataGrid 转换为 DataTable?

    嗨 我正在关注这个guide http www wpf tutorial com datagrid control details row 以了解如何使用 DataGrid 我遇到的问题是如何将 DataGrid 中的数据转换为 DataT
  • 使用路径=。和绑定内的转换器

    我无法为 TreeViewItems 定义触发器 我相信这只是一些语法问题 但我不知道还要写什么 这是触发器
  • 从代码访问 WPF 控件验证规则

    XAML
  • 以编程方式绑定 WPF 中的附加属性

    我在用着杰森 坎普很酷CueBanner class http www ageektrapped com blog the missing net 4 cue banner in wpf i mean watermark in wpf 对于
  • 从 StaticResource 设置 RowDefinition 高度

    在我的 WPF 样式中 我定义了一个标准网格行高 我想将其应用到几个地方 如下所示
  • WPF 中图像的淡入淡出

    当我更改幻灯片放映等图像源时 如何实现淡入和淡出图像 我的图像从本地和网络加载 并且其数量是可变的 谢谢 您可以编写一个扩展方法 通过动画显示图像来淡出图像Opacity属性设置为 0 然后设置Source属性并最终将不透明度动画回到 1
  • 强制 protobuf-net 忽略 IEnumerable/ICollection 接口

    如何让 protobuf net v2 忽略我的类实现 ICollection IEnumerable 等的事实 对于这个特定场景 我只希望序列化标记为 ProtoMember 的字段 我目前正在从使用 protobuf net v1 转换
  • 通过 RDP 使用 WPF 的 Direct2d

    我正在开发一个 C 应用程序 它使用 SharpDx 通过 Direct2d 渲染地图 该地图与 D3DImage 一起显示在 WPF 主机上 在本地计算机上 一切正常 但当我尝试通过远程桌面连接时 D3DImage 会丢失其后备缓冲区 并
  • 调整屏幕和字体设置的 WPF 应用程序(或者,我如何将 DLU 与 WPF 中的单元相关联?)

    在MFC中 对话框的设计使用DLUs http msdn microsoft com en us library bb847924 aspx 在 WPF 中 我们以 1 96 英寸为单位指定 虽然这确实会缩放窗口和视觉元素 但我们如何使 W

随机推荐

  • 以 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