WPF DataGrid CanUserAddRows = True

2023-12-24

我似乎在向 a 添加行时遇到问题DataGrid通过界面本身。 这是用户界面的屏幕截图:

正如您所看到的,在数据​​库中找到了 0 行,因此没有任何内容显示在数据库中DataGrid在右侧。 但我喜欢那里有一个空行,用于手动添加行。 这DataGrid.CanUserAddRows被设定为True但没有效果。 这里是xaml为了DataGrid,我冒昧地删除了一些代码以使其更小。

权限详细信息视图.xaml

<UserControl ...
             d:DataContext="{d:DesignInstance impl:PrivilegeDetailsViewModel}">
    <DataGrid ...
              ItemsSource="{Binding RolesHasPrivilegesOnObjects}" 
              AutoGenerateColumns="False"
              CanUserAddRows="True">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Type" CanUserSort="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate DataType="{x:Type int:IRoleHasPrivilegeOnObjectListItemViewModel}">
                        <Image Source="{Binding Icon}" ToolTip="{Binding ToolTip}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Width="*" Header="Name" Binding="{Binding Name}"/>
            <DataGridCheckBoxColumn Header="Select" Binding="{Binding HasSelect, UpdateSourceTrigger=PropertyChanged}">
                <DataGridCheckBoxColumn.ElementStyle>
                    <Style TargetType="CheckBox">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding CanHaveSelect}" Value="True">
                                <Setter Property="IsEnabled" Value="True"/>
                                <Setter Property="HorizontalAlignment" Value="Center"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding CanHaveSelect}" Value="False">
                                <Setter Property="IsEnabled" Value="False"/>
                                <Setter Property="HorizontalAlignment" Value="Center"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </DataGridCheckBoxColumn.ElementStyle>
            </DataGridCheckBoxColumn>
            ...
        </DataGrid.Columns>
    </DataGrid>
</UserControl>

PrivilegeDetailsView.xaml.cs

public partial class PrivilegeDetailsView : IPrivilegeDetailsView
{
    public PrivilegeDetailsView() { InitializeComponent(); }

    public DataGrid PrivilegesOnObjectsDataGrid { get { return PrivilegeDataGrid; } }

    public IViewModel ViewModel
    {
        get { return (IViewModel)DataContext; }
        set { DataContext = value; }
    }
}

这里是ViewModel (VM)为了xaml View above:

PrivilegeDetailsViewModel.cs

public class PrivilegeDetailsViewModel : ViewModelBase, IPrivilegeDetailsViewModel
{
    private readonly IEventAggregator _eventAggregator;
    private readonly IPrivilegeViewModel _privilegeViewModel;
    private readonly IRoleHasPrivilegeOnObjectViewModelAdapterRepository _roleHasPrivilegeOnObjectViewModelAdapterRepository;
    private ObservableCollection<IRoleHasPrivilegeOnObjectListItemViewModel> _rolesHasPrivilegesOnObjects;

    public PrivilegeDetailsViewModel(IPrivilegeDetailsView view,
                                     IRoleHasPrivilegeOnObjectViewModelAdapterRepository roleHasPrivilegeOnObjectViewModelAdapterRepository,
                                     IPrivilegeViewModel privilegeViewModel,
                                     IEventAggregator eventAggregator) : base(view)
    {
        _roleHasPrivilegeOnObjectViewModelAdapterRepository = roleHasPrivilegeOnObjectViewModelAdapterRepository;
        _privilegeViewModel = privilegeViewModel;
        _eventAggregator = eventAggregator;
        Initialize();
    }

    protected override sealed void Initialize()
    {
        _privilegeViewModel.PropertyChanged += PrivilegeViewModelOnPropertyChanged;
        _eventAggregator.GetEvent<ToggleSelectPrivilegeEvent>().Subscribe(ToggleSelectPrivilege);
        ...
    }

    public new IPrivilegeDetailsView View
    {
        get { return (IPrivilegeDetailsView)base.View; }
    }

    public ObservableCollection<IRoleHasPrivilegeOnObjectListItemViewModel> RolesHasPrivilegesOnObjects
    {
        get { return _rolesHasPrivilegesOnObjects; }
        set
        {
            _rolesHasPrivilegesOnObjects = value;
            OnPropertyChanged();
        }
    }

    public void Save()
    {
        if(RolesHasPrivilegesOnObjects == null) return;
        _roleHasPrivilegeOnObjectViewModelAdapterRepository.SaveChanges(RolesHasPrivilegesOnObjects);
    }        

    private void ToggleExecutePrivilege(object obj)
    {
        var toggle = !View.PrivilegesOnObjectsDataGrid.SelectedItems.Cast<IRoleHasPrivilegeOnObjectListItemViewModel>()
                          .All(x => x.HasExecute);
        foreach(var selectedItem in View.PrivilegesOnObjectsDataGrid
                                        .SelectedItems
                                        .Cast<IRoleHasPrivilegeOnObjectListItemViewModel>()
                                        .Where(selectedItem => selectedItem.Object
                                                                           .CanHavePrivilege("EXECUTE"))) {
                                            selectedItem.HasExecute = toggle; 
                                        }
    }

    ...

    private void PrivilegeViewModelOnPropertyChanged(object s, PropertyChangedEventArgs e)
    {
        switch(e.PropertyName)
        {
            //When the SelectedSchema changes in the parent VM, I get the new rows to be shown in the DataGrid.
            case "SelectedSchema":
                RolesHasPrivilegesOnObjects = _roleHasPrivilegeOnObjectViewModelAdapterRepository
                                                  .GetPrivilegesOnObjectsAssociatedWith((IRoleEntityViewModel)_privilegeViewModel.SelectedRole,
                                                  (IContainerEntityViewModel)_privilegeViewModel.SelectedSchema);
                break;
        }
    }
}

这是VM对于中的每一行DataGrid

RoleHasPrivilegeOnObjectEntityViewModel.cs

public class RoleHasPrivilegeOnObjectEntityViewModel : EntityViewModelBase<RoleHasPrivilegeOnObjectEntityViewModel, 
                                                       RoleHasPrivilegesOnObject>, 
                                                       IRoleHasPrivilegeOnObjectListItemViewModel
{
    private readonly RoleHasPrivilegesOnObject _roleHasPrivilegesOnObject;

    public RoleHasPrivilegeOnObjectEntityViewModel(RoleHasPrivilegesOnObject roleHasPrivilegesOnObject)
    {
        _roleHasPrivilegesOnObject = roleHasPrivilegesOnObject;
        Role = new RoleEntityViewModel(_roleHasPrivilegesOnObject.Role);
        Object = new ObjectEntityViewModel(_roleHasPrivilegesOnObject.Object);
    }

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

    public override RoleHasPrivilegesOnObject OriginalEntity { get { return _roleHasPrivilegesOnObject; } }

    public IRoleEntityViewModel Role { get; set; }

    public IObjectEntityViewModel Object { get; set; }

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

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

    public bool CanHaveExecute { get { return _roleHasPrivilegesOnObject.CanHaveExecute; } }

    public override string Icon { get { return Object != null ? Object.Icon : string.Empty; } }

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

    ...
}

我知道这是很多代码,我已经删除了很多代码并放置了一些点(...)以表明存在更多代码。注意:我正在使用EF5 http://msdn.microsoft.com/en-us/data/ef.aspx and PRISM http://compositewpf.codeplex.com/

我怎样才能使DataGrid通过 GUI 接受新行?


我相信你的问题是使用ObservableCollection<IRoleHasPrivilegeOnObjectListItemViewModel> as ItemsSource。为了DataGrid为了能够创建新行,必须有一个可以使用空构造函数构造的类型。

如果你把它改成说ObservableCollection<RoleHasPrivilegeOnObjectEntityViewModel>相反,我很确定您的行将开始添加。

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

WPF DataGrid CanUserAddRows = True 的相关文章

  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • 网格内的 ContentPresenter 可见性绑定不起作用?

    我有以下网格
  • 比较运算符性能 <= 与 !=

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

    所以我有一个没有背景的矩形 当用户将鼠标悬停在其上时 我想给它一个背景渐变 然后当鼠标离开矩形时删除渐变 请有人发布所需的代码 并告诉我将其放在 cs xaml 文件中的位置吗 Thanks This
  • 从 xaml 获取 RowIndex

    我有一个带有 DataGridTemplateColumns 的 DataGrid 在 TemplateColumn 中 我使用工作正常的 DataTrigger 它从 DataGrid 父级检索项目计数
  • WPF 数据绑定到复合类模式?

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

    我创建了用作 ListView 项目模板的样式 其中包含 CheckBox 和 TextBlock
  • WPF 处理文本、图像和文件粘贴事件

    我正在开发一个 WPF 应用程序 我想捕获 RichTextBox 输入中的粘贴命令并处理粘贴的文件 为此 我使用以下回调
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • WPF 绑定 CompositeCollection 中的 MenuItem 不起作用

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

    我试图弄清楚依赖属性到底是什么 但是当我在任何地方寻找定义时 我只找到 如何使用 而不是 它是什么 想象一下 您在面试时被问到 什么是依赖属性 你的答案是什么 DependencyProperty 是一个属性 其值取决于 或可以取决于 某些
  • WPF ListView/Gridview 允许用户选择多个项目并将它们分组在一起

    我在 MVVM 应用程序中有一个 WPF ListView GridViwe GridView 绑定到 ViewModel 中的列表 要求是用户应该能够选择网格视图的多行 右键单击它并看到上下文菜单 将这些行组合在一起 选择后 所有这些项目
  • .NET / C# / WPF 项目的命名约定

    NET C WPF 项目广泛接受的命名约定是什么 Microsoft 有一篇关于命名约定的内容广泛的 MSDN 文章here http msdn microsoft com en us library ms229002 aspx
  • 如何枚举控件的所有依赖属性?

    我有一些 WPF 控件 例如 文本框 如何枚举该控件的所有依赖属性 如 XAML 编辑器所做的那样 不需要使用反射 恕我直言 这是一个坏主意 因为框架已经为此提供了实用程序类 但它们并不明显找到 以下是基于这篇文章的答案 枚举绑定 http
  • 无法将像素着色器渲染到 RenderTargetBitmap!请帮忙!

    我编写了一个非常简单的 WPF 应用程序来测试渲染具有与 RenderTargetBitmap 关联的像素着色器的控件的能力 然后我将位图写入文件 jpeg 该控件被渲染到位图上 但是像素着色器效果不会应用于该控件 代码和 XAML 如下
  • 解释 System.Diagnostics.CodeAnalysis.SuppressMessage

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

    I have ObservableCollection绑定到dataGrid现在我想过滤我看到需要使用的呈现数据ICollectionView但我不知道如何添加ICollectionView和我的MVVM图案 我的代码简化如下 public
  • WPF 单击鼠标即可展开 TreeView

    我有一个带有 HierarchicalDataTemplate 的 WPF TreeView 目前我必须双击一个项目才能展开 折叠它 我想将此行为更改为单击 而不丢失其他功能 所以它应该在点击时展开和折叠 推荐的方法是什么 Thanks 您
  • Azure 可以运行 WPF 吗?

    我想编写一个在 Windows Azure 上运行的 ASP Net MVC 应用程序 该应用程序将使用 WPF 创建图像 在我开始写之前 这会起作用吗 Azure 是否具有渲染 WPF 所需的 DLL 包括 DirectX 和图形功能 我
  • 将两个垂直滚动条相互绑定

    我在控件中有两个 TextBox 并且它们都有两个 VerticalScrollBar 我想在它们之间绑定 VerticalScrollBars 如果一个向上 第二个也会向上等等 如果可以的话我该怎么做 Thanks 不是真正的绑定 但它有

随机推荐