2014-01-15 136 views
0

我遇到了我的ComboBoxesDataGrid的问题,让我来解释一些图片。DataGrid DataGridTemplateColumn组合框

enter image description here

这是起点。

enter image description here

现在,如果我想添加一个新行我点击了最后一排,然后按Enter。

enter image description here

一个新行添加和IV所选类型的表这里给它一个名字MY_TABLE,然后我按回车键添加其他行。

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"); 
     } 
    } 
} 

这里是我的ViewDataGrid

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

我已经尝试了所有这些变体的ComboBoxItemsSourceSelectedItem

<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的行为与预期一致?

回答

0

看来,一个简单的UpdateSourceTrigger属性缺失的SelectedObjectTypexamlComboBox结合,这样

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