DataGrid DataGridTemplateColumn ComboBox

时间:2014-01-15 12:48:26

标签: wpf combobox prism wpfdatagrid

我在ComboBoxes中遇到DataGrid时遇到问题,让我用几张照片解释一下。

enter image description here

这是起点。

enter image description here

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

enter image description here

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

enter image description here

结果是,先前添加的行的类型选择的组合框已经回到无。 注意:,复选框以前是灰色的类型,无法拥有任何权限,但是表格可以有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 ItemsSourceSelectedItem

尝试了所有这些变体
<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按预期行事?

1 个答案:

答案 0 :(得分:0)

UpdateSourceTrigger的{​​{1}} SelectedObjectType绑定似乎缺少一个简单的xaml属性,就像这样

ComboBox