【问题标题】:User Friendly Way to Display a ComboBox in a WPF DataGrid using MVVM使用 MVVM 在 WPF DataGrid 中显示组合框的用户友好方式
【发布时间】:2014-05-09 15:58:23
【问题描述】:

我有一个使用 MVVV 的 WPF 应用程序;我有一个对象中的项目集合,ItemsCollection 中项目的属性之一是枚举,我希望用户能够使用下拉组合框或文本字段编辑 ItemsCollection 中项目的属性.集合显示在 DataGrid 中。我很难让组合框显示并允许用户以非常简单的方式(单击,键盘输入)与它和文本框进行交互。现在,需要在单元格中单击两次才能在“名称”字段中键入,我希望单击一下就可以允许用户编辑值。

还需要三个!点击展开使用我下面的方法打开组合框的内容。

我已经尝试了很多关于堆栈溢出的方法,但这是我发现的第一个解决方案,它甚至可以让枚举填充组合框并在我的属性枚举中调用集合

是否有人可以帮助我找到一种方法,允许用户通过单击给定行来更新条目(即单击文本字段进行编辑或单击 ComboBox 将其展开)我'现在已经在这里工作了几个小时,我觉得我对DataGrid 如何与焦点和选定的单元格/行一起工作的理解越来越少。我在下面有 XAML - 后面没有代码。

基本上:DataGrid,用户可以单击列中的单元格以选择单元格内的所有文本进行编辑,或者他们可以单击ComboBox 使其与枚举一起下拉,以便他们可以选择一个值并通过进一步单击将其应用于项目

<Window.Resources>
   <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="GetEnumValues">
      <ObjectDataProvider.MethodParameters>
         <x:Type TypeName="MockItem+ValidItemsType"/>
      </ObjectDataProvider.MethodParameters>
   </ObjectDataProvider>
</Window.Resources>

<DataGrid 
   Grid.Column="0" 
   Margin="0,0,0,5" 
   SelectionMode="Single" 
   SelectedItem="{Binding Model.SelectedMockItem, UpdateSourceTrigger=LostFocus}" 
   Name="ModelItemDataGrid" 
   MaxHeight="350" 
   VerticalScrollBarVisibility="Auto"  
   ItemsSource="{Binding Model.MockObject.MockItemsCollection}" 
   Height="Auto" 
   HorizontalGridLinesBrush="#CBCBCB"  
   VerticalGridLinesBrush="#CBCBCB" 
   AutoGenerateColumns="False" 
   IsReadOnly="False" >
   <DataGrid.Columns>
      <DataGridTextColumn  Binding="{Binding Name}" Header="Name" Width="Auto"  />
      <DataGridComboBoxColumn  Width="120" ItemsSource="{Binding Source={StaticResource GetEnumValues}}" SelectedValueBinding="{Binding ValidItem}" />
      <DataGridTemplateColumn x:Name="SelectedItemColumn" Header="Valid Item Type" Width="Auto" >
         <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
               <TextBox IsReadOnly="True" Text="{Binding Path=ValidItem}" d:DataContext="{d:DesignData MockItem}" >
                  <TextBox.Style>
                     <Style TargetType="{x:Type TextBox}" >
                        <Setter Property="Background" >
                           <Setter.Value>
                              <SolidColorBrush Color="{Binding Path=ValidItem, Converter= {StaticResource MockItemValidItemToBackgroundColourConverter1}}" d:DataContext="{d:DesignData MockItem}"  />
                           </Setter.Value>
                        </Setter>
                     </Style>
                  </TextBox.Style>
               </TextBox>
            </DataTemplate>
         </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
   </DataGrid.Columns>
</DataGrid>

【问题讨论】:

  • 为什么不使用可编辑的组合框?然后你可以像你一样使用 DataGridTemplateColumn 。但也有CellEditingTemplate以及CellTemplate,并在DataGridTemplateColumn.CellEditingTemplate中放了一个combobox。
  • 感谢您的回复,有机会我会试一试,看看是否可以使用它

标签: wpf mvvm datagrid


【解决方案1】:
<Style TargetType="DataGridCell">
     <Style.Triggers>
         <Trigger Property="IsMouseOver" Value="True">
             <Setter Property="IsEditing" Value="True" />
         </Trigger>
     </Style.Triggers>
 </Style>

这对你有帮助,我和你有同样的问题。

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 2023-03-18
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2020-05-21
    • 1970-01-01
    相关资源
    最近更新 更多