2016-01-23 123 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