3

現時点では、次のものがあります。

<DataGridTextColumn Header="Customer Name" 
    x:Name="columnCustomerSurname" 
    Binding="{Binding Path=Customer.FullName}" SortMemberPath="Customer.Surname"
    IsReadOnly="True">
</DataGridTextColumn>

は次のようにCustomer.FullName定義されます。

public string FullName
{
    get { return string.Format("{0} {1}", this.Forename, this.Surname); }
}

バインディングは機能しますが、理想的ではありません。

誰かがForenameまたはSurnameプロパティを更新した場合、その更新は更新されるまで DataGrid に反映されません。

MultiBindingこれに似た問題を見つけましTextBlockDataGrid.

これを機能させる別の方法はありますか?

4

2 に答える 2

5

1 つのオプションは、2 つのテキストブロックに基づいて複合テンプレート列を作成することです。これにより、いずれかのプロパティが変更されたときにフォームを更新できます。

例えば。

<DataGridTemplateColumn Header="Customer Name">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Path=Customer.ForeName}"/>
                <TextBlock Text="{Binding Path=Customer.SurName}"/>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
于 2012-06-07T18:45:37.297 に答える
2

とのFullName両方からプロパティ変更通知を発生させる必要があります。ForenameSurname

public string Forename
{
    get{ return _forename; }
    set
    {
        if(value != _forename)
        {
            _forename = value;
            RaisePropertyChanged("Forename");
            RaisePropertyChanged("Fullname");
        }
    }
}

または、このように FullName の生成された値をキャッシュします

public string Forename
{
    get{ return _forename; }
    set
    {
        if(value != _forename)
        {
            _forename = value;
            RaisePropertyChanged("Forename");
            UpdateFullName();
        }
    }
}

private void UpdateFullName()
{  
    FullName = string.Format("{0} {1}", this.Forename, this.Surname); 
}

public string FullName
{
    get{ return _fullname; }
    private set
    {
        if(value != _fullname)
        {
            _fullname = value;
            RaisePropertyChanged("FullName");
        }
    }
}
于 2012-06-07T15:45:27.713 に答える