2016-06-10 4 views
0

Позвольте мне сначала объяснить, что я хочу, я хотел бы иметь datagrid, который будет иметь ComboBox, и позволяет сказать список компаний. Когда я выбираю компанию, я бы хотел, чтобы ячейка (DataGridTextColumn) рядом с ней заполнила номер телефона компании.Связывание DataGridTextComun с DataGridComboBoxColumn.SelectedItem

Я смог сделать это с помощью обычного ComboBox и TextBox, но когда я доберусь до Datagrid, он работает некорректно. Ниже представлен проект, который я создал для этого примера.

enter image description here

 <DataGrid Grid.Row="3" 
       Grid.Column="0" 
       Grid.ColumnSpan="2" 
       ItemsSource="{Binding People}" 
       AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridComboBoxColumn Header="Comapny" 
            x:Name="ComboBoxColumn" 
            SelectedValuePath="{Binding CompanyId}" 
            DisplayMemberPath="Name"> 
       <DataGridComboBoxColumn.ElementStyle> 
        <Style TargetType="{x:Type ComboBox}"> 
         <Setter Property="ItemsSource" 
           Value="{Binding Path=DataContext.Companies, 
          RelativeSource={RelativeSource AncestorType={x:Type Window}}}" /> 
        </Style> 
       </DataGridComboBoxColumn.ElementStyle> 
       <DataGridComboBoxColumn.EditingElementStyle> 
        <Style TargetType="{x:Type ComboBox}"> 
         <Setter Property="ItemsSource" 
           Value="{Binding Path=DataContext.Companies, 
          RelativeSource={RelativeSource AncestorType={x:Type Window}}}" /> 
         <Setter Property="IsEditable" 
           Value="True" /> 
         <Setter Property="SelectedItem" 
           Value="{Binding Path=DataContext.Company}"/> 
        </Style> 
       </DataGridComboBoxColumn.EditingElementStyle> 
      </DataGridComboBoxColumn> 
      <DataGridTextColumn Header="Company Phone" 
           Binding="{Binding ElementName=ComboBox, 
       Path=SelectedItem.Phone, 
       UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Header="Person Name" 
           Binding="{Binding Name}" /> 
     </DataGrid.Columns> 
    </DataGrid> 

Компания:

{ 
    private string _name; 
    private string _phone; 
    public int Id { get; set; } 

    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      if(_name!=value) 
      { 
       _name = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 
    public string Phone 
    { 
     get { return _phone; } 
     set 
     { 
      if (_phone != value) 
      { 
       _phone = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

лицо:

public class Person:INotifyPropertyChanged 
{ 
    private Company _company; 
    private int _companyId; 
    private string _name; 
    public int Id { get; set; } 

    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      if (_name != value) 
      { 
       _name = value; 
      } 
     } 
    } 

    public Company Company 
    { 
     get { return _company; } 
     set 
     { 
      if (_company != value) 
      { 
       _company = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 

    public int CompanyId 
    { 
     get { return _companyId; } 
     set 
     { 
      if (_companyId != value) 
      { 
       _companyId = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Я не уверен, что я делаю неправильно.

спасибо за вашу помощь

ответ

1

Почему лицо имеет компанию и CompanyID? Сама компания имеет свойство Id, не нужно копировать ее на Person. Я собираюсь удалить CompanyId из Person для ответа.

DataGridComboBoxColumn - избавиться от SelectedValuePath = "{Binding CompanyId}" и добавить SelectedItemBinding = "{Binding Company, UpdateSourceTrigger = PropertyChanged}". UpdateSourceTrigger так обновляется, как только вы выбираете компанию.

<DataGridComboBoxColumn Header="Company" 
        x:Name="ComboBoxColumn" 
        SelectedItemBinding="{Binding Company, UpdateSourceTrigger=PropertyChanged}" 
        DisplayMemberPath="Name"> 

Другой номер телефона компании DataGridTextColumn. Вы привязываетесь к элементу «ComboBox» (хотя, я думаю, вы имели в виду «ComboBoxColumn»?). Но это не то, что вы думаете. Это сам DataGridComboBoxColumn не является экземпляром того, что он определяет, а не фактическим combobox.

Вам не нужно ссылаться на поле со списком, объект Person, который является DataContext строки, имеет ссылку на компанию, поэтому просто используйте это. Измените телефон компании DataGridTextColumn на это:

<DataGridTextColumn Header="Company Phone" Binding="{Binding Path=Company.Phone, UpdateSourceTrigger=PropertyChanged}"/> 

Я надеюсь, что это поможет.

+0

спасибо. Это помогает! – JamTay317