2016-01-23 173 views
0

我发现this tutorial网上这正是我试图做的,但本教程并没有解释如何从后面的代码将数据加载到组合框。任何想法如何实现这一目标?将数据绑定到数据网格multicolum,组合框WPF

基本上我想在数据网格多列组合框,以及当用户选择一个项目,它仅显示值中的一个,而不是两个。

<DataGrid x:Name="DGOrders" Margin="30" AutoGenerateColumns="False" > 
<DataGrid.Columns> 
    <DataGridTextColumn Binding="{Binding OrderID}" Header="Order ID" /> 
    <DataGridTemplateColumn Header="User" Width="200"> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <ComboBox SelectedValue="{Binding UserID}" SelectedValuePath="UserID" DisplayMemberPath="CompanyName" HorizontalContentAlignment="Stretch" ItemsSource="{Binding}" > 
        <ComboBox.ItemContainerStyle> 
         <Style TargetType="{x:Type ComboBoxItem}"> 
          <Setter Property="Template"> 
           <Setter.Value> 
            <ControlTemplate> 
             <Grid> 
              <Grid.ColumnDefinitions> 
               <ColumnDefinition Width="Auto"/> 
               <ColumnDefinition Width="*"/> 
               <ColumnDefinition Width="*"/> 
              </Grid.ColumnDefinitions> 
              <TextBlock Margin="5" Grid.Column="0" Text="{Binding UserID}"/> 
              <TextBlock Margin="5" Grid.Column="1" Text="{Binding CompanyName}"/> 
              <TextBlock Margin="5" Grid.Column="2" Text="{Binding UserName}"/> 
             </Grid> 
            </ControlTemplate> 
           </Setter.Value> 
          </Setter> 
         </Style> 
        </ComboBox.ItemContainerStyle> 
       </ComboBox> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
</DataGrid.Columns> 

回答

1

我不知道你通过只显示值中的一个,而不是两个意思,但我希望解释一下自我,一旦我告诉你如何正确地在DataGrid绑定属性,首先你需要确保你的模型看起来是这样的:

public class Order 
{ 
    public string OrderId { get; set; } 
    public string SelectedUserId { get; set; } 
} 

public class User 
{ 
    public string UserId { get; set; } 
    public string CompanyName { get; set; } 
    public string UserName { get; set; } 
} 

然后后面的代码中创建两个collectionw来保存用户列表和订单列表,它代表了DataContextComboBoxDataGrid

private ObservableCollection<Order> _ordersCollection = new ObservableCollection<Order>() 
    { 
     new Order() 
     { 
      OrderId = "1", 
      SelectedUserId = "2" 
     } ,new Order() 
     { 
      OrderId = "2", 
      SelectedUserId = "3" 
     } 
    }; 

    public ObservableCollection<Order> OrdersCollection 
    { 
     get 
     { 
      return _ordersCollection; 
     } 

     set 
     { 
      if (_ordersCollection == value) 
      { 
       return; 
      } 

      _ordersCollection = value; 
      OnPropertyChanged(); 
     } 
    } 


    private ObservableCollection<User> _usersCollection = new ObservableCollection<User>() 
    { 
     new User() 
     { 
      UserId = "1", 
      UserName = "Name1", 
      CompanyName = "Company1" 
     } ,new User() 
     { 
      UserId = "2", 
      UserName = "Name2", 
      CompanyName = "Company2" 
     } ,new User() 
     { 
      UserId = "3", 
      UserName = "Name3", 
      CompanyName = "Company3" 
     } 
    }; 


    public ObservableCollection<User> UsersCollection 
    { 
     get 
     { 
      return _usersCollection; 
     } 

     set 
     { 
      if (_usersCollection == value) 
      { 
       return; 
      } 

      _usersCollection = value; 
      OnPropertyChanged(); 
     } 
    } 

你可以考虑实施INotifyPropertyChanged接口,这样用户界面将在每次采集更新时通知。

现在,在UI,请确保您的主窗口的DataContext使用此

DataContext="{Binding RelativeSource={RelativeSource Self}}" 

然后正确绑定属性设置为隐藏代码:

<Grid> 
    <DataGrid x:Name="DGOrders" Margin="30" AutoGenerateColumns="False" ItemsSource="{Binding OrdersCollection}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding OrderId}" Header="Order ID" /> 
      <DataGridTemplateColumn Header="User" Width="200" > 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox SelectedValue="{Binding SelectedUserId}" SelectedValuePath="UserId" DisplayMemberPath="CompanyName" HorizontalContentAlignment="Stretch" ItemsSource="{Binding DataContext.UsersCollection,ElementName=DGOrders}" > 
          <ComboBox.ItemContainerStyle> 
           <Style TargetType="{x:Type ComboBoxItem}"> 
            <Setter Property="Template"> 
             <Setter.Value> 
              <ControlTemplate> 
               <Grid> 
                <Grid.ColumnDefinitions> 
                 <ColumnDefinition Width="Auto"/> 
                 <ColumnDefinition Width="*"/> 
                 <ColumnDefinition Width="*"/> 
                </Grid.ColumnDefinitions> 
                <TextBlock Margin="5" Grid.Column="0" Text="{Binding UserId}"/> 
                <TextBlock Margin="5" Grid.Column="1" Text="{Binding CompanyName}"/> 
                <TextBlock Margin="5" Grid.Column="2" Text="{Binding UserName}"/> 
               </Grid> 
              </ControlTemplate> 
             </Setter.Value> 
            </Setter> 
           </Style> 
          </ComboBox.ItemContainerStyle> 
         </ComboBox> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
     </DataGrid> 
</Grid> 

你最终将像这样的东西

enter image description here

+0

感谢您的时间和a nswer。我试着你的建议,并得到以下错误 - 错误没有重载的方法'OnPropertyChanged'需要0参数' – Gisiota

+0

在代码隐藏实现INotifyPropertyChanged接口 – Usama

+0

谢谢你的工作。出于好奇,如果datacontext是来自数据集的话,这种方法会起作用吗? – Gisiota