DataGrid DataGridTemplateColumn组合框 [英] DataGrid DataGridTemplateColumn ComboBox

查看:38
本文介绍了DataGrid DataGridTemplateColumn组合框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 DataGrid 中的 ComboBoxes 遇到了麻烦,请允许我解释一些图片.

I'm having trouble with my ComboBoxes in a DataGrid, let me explain with a few pictures.

这是起点.

现在,如果要添加新行,请单击最后一行,然后按Enter.

Now if I want to add a new row I click the last row and hit Enter.

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

A new row is added and iv selected type table here and given it a name MY_TABLE, then I hit enter to add another row.

结果是这样的,先前添加的行的类型选择的组合框已回到无.注意::以前,复选框为灰色,因为类型None不能具有任何特权,但是表可以具有 CRUD ,因此当我选择类型表时,它们就启用了.

The result is this, the combobox for the previous added row's type selection has gone back to None. NOTE: that the checkboxes were previously grayed out as type None cant have any privileges, but table can have CRUD so when I selected type table they became enabled.

这是每行的 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");
        }
    }
}

这是我对 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 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 表现出预期的效果?

What do I have to do to make the ComboBox behave as expected?

推荐答案

似乎在 xaml中的 SelectedObjectType 绑定上缺少简单的 UpdateSourceTrigger 属性用于 ComboBox ,就像这样

It seems that a simple UpdateSourceTrigger attribute was missing on the SelectedObjectType binding in the xaml for the ComboBox, like this

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

这篇关于DataGrid DataGridTemplateColumn组合框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆