2016-01-23 5 views
0

Я нашел this tutorial, что именно то, что я пытаюсь сделать, но учебник не объясняет, как загружать данные из кода в combobox. любая идея, как я могу добиться этого?Привязать данные к многоколоновому datagrid-combobox wpf

В принципе, я хочу, чтобы многоколонный combobox в datagrid, и когда пользователь выбирает элемент, он отображает только одно из значений, а не то, и другое.

<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 для хранения списка пользователей и списка заказов, которые представляют DataContext для ComboBox и DataGrid:

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 так, что пользовательский интерфейс будет извещен каждый раз, когда коллекция обновляется.

Теперь в пользовательском интерфейсе, убедитесь, что главного окна 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

благодарит за ваше время и nswer. Я попробовал то, что вы предложили, и получите следующую ошибку: Ошибка Перегрузка для метода 'OnPropertyChanged' принимает 0 аргумент ' – Gisiota

+0

В коде для реализации интерфейса INotifyPropertyChanged – Usama

+0

Спасибо, что сработали. Из любопытства, будет ли этот метод работать, если datacontext был из набора данных? – Gisiota

Смежные вопросы