0

最初に私が何を望んでいるのかを説明させてください.ComboBoxを持つデータグリッドが必要です.会社のリストを言ってみましょう. 会社を選択するとき、その横にあるセル (DataGridTextColumn) に会社の電話番号を入力したいと思います。

通常の ComboBox と TextBox でこれを行うことができましたが、Datagrid に到達すると正しく動作しないようです。以下は、このサンプル用に作成したプロジェクトです。

ここに画像の説明を入力

        <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));
    }
}

何が間違っているのかわかりません。

ご協力いただきありがとうございます

4

1 に答える 1

1

Person に Company と CompanyId があるのはなぜですか? Company 自体に Id プロパティがあり、Person に複製する必要はありません。この回答では、Person から CompanyId を削除します。

DataGridComboBoxColumn - SelectedValuePath="{Binding CompanyId}" を取り除き、SelectedItemBinding="{Binding Company, UpdateSourceTrigger=PropertyChanged}" を追加します。UpdateSourceTrigger は、会社を選択するとすぐに電話番号が更新されるようにするためのものです。

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

もう 1 つの問題は、会社の電話の DataGridTextColumn にあります。要素「ComboBox」にバインドしています(ただし、「ComboBoxColumn」を意味していると思いますか?)。しかし、それはあなたが思っていることではありません。それは DataGridComboBoxColumn 自体であり、定義されているもののインスタンスではなく、実際のコンボボックスではありません。

コンボボックスを参照する必要はありません。行の DataContext である person オブジェクトには Company への参照があるため、それを使用するだけです。会社の電話の DataGridTextColumn を次のように変更します。

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

それが役立つことを願っています。

于 2016-06-10T20:03:07.520 に答える