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 的相关文章

随机推荐