Lassen Sie mich zuerst erklären, was ich will, ich hätte gerne ein Datagrid, das eine ComboBox haben wird, sagen wir eine Liste von Unternehmen. Wenn ich eine Firma wähle, möchte ich die Zelle (DataGridTextColumn) daneben, um die Firma Telefonnummer zu füllen.Ein DataGridTextComun an DataGridComboBoxColumn.SelectedItem binden
Ich konnte dies mit einer regulären ComboBox und TextBox tun, aber wenn ich zu einem Datagrid komme, scheint es nicht richtig zu funktionieren. Unten ist das Projekt, das ich für dieses Beispiel erstellt habe.
<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>
Firma:
{
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));
}
Person:
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));
}
}
Ich bin nicht sicher, was ich falsch mache.
Dank für Ihre Hilfe
Vielen Dank. Das hilft! – JamTay317