0

次のようなオブジェクトにバインドされた Entity Framework モデルがあります。

public class Object
{
    public string _name; //actual name
    public string _display_name;
    ....
}

ほとんどの場合、display_name は actual_name と同じになります。したがって、WPF ウィンドウには、2 つの入力 (TextBox) を持つビューがあります。

最初の入力は、View Model プロパティ DisplayName にバインドされます。これの目的は、2 番目の入力 (表示名) がデフォルトで最初の入力 (実際の名前) と等しくなるようにすることです。

<TextBox x:Name="NameInputBox" Margin="5,5,5,5" Width="100" MaxLength="50"
                         Text="{Binding Path=Name, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" />

2 番目の入力は MultiBinding を使用しています。MultiBinding の最初のバインディングは、最初の入力の Text プロパティに対するものです。これにより、2 番目のボックスが最初のボックスと等しくなるように適切に更新されます。

2 番目のバインドは、ビュー モデルの DisplayName プロパティにバインドされます。2 番目の入力テキストが変更されているにもかかわらず、DisplayName プロパティが設定されていません。

<TextBox x:Name="DisplayNameInput" Margin="5,5,5,5" Width="100" MaxLength="50">
    <TextBox.Text>
        <MultiBinding Converter="{StaticResource TwoToOneConverter}">
            <Binding ElementName="NameInputBox" Path="Text" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
            <Binding Path="DisplayName" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" />
        </MultiBinding>
    </TextBox.Text>
</TextBox>

プロパティは次のとおりです。

public String Name
{
    get { return _name; }
    set
    {
        _name = value;
        OnPropertyChanged("Name");
    }
}

public string DisplayName
{
    get { return _display_name; }
    set
    {
        _display_name = value;
        OnPropertyChanged("DisplayName");
    }
}

最後に、私のコンバーター:

/// <summary>
/// When given two inputs, just take one of them.
/// </summary>
public object Convert(object[] values, Type targetType, object parameter, 
    System.Globalization.CultureInfo culture) 
{
    return values[0];
}

/// <summary>
/// Return the value, unchanged, as two values.
/// </summary>
public object[] ConvertBack(object value, Type[] targetTypes, object parameter,
    System.Globalization.CultureInfo culture)
{
    return new object[] { value, value };
}

私が間違っていることについて誰か考えがありますか? オンライン サンプルに示されている方法で使用していないため、コンバーターに関係があるように感じます。私が試みていることを達成する別の方法はありますか?

4

1 に答える 1

1

コードからこれを行う方が理にかなっている_display_namenull思いDisplayNameますNameOnPropertyChanged("DisplayName");これは、Nameセッターに追加する必要があることも意味します。

public String Name
{
    get { return _name; }
    set
    {
        _name = value;
        OnPropertyChanged("Name");
        OnPropertyChanged("DisplayName");
    }
}

public string DisplayName
{
    get { return _display_name ?? _name; }
    set
    {
        _display_name = value;
        OnPropertyChanged("DisplayName");
    }
}

Bindingこれで、 の代わりにnormal を使用できるMultiBindingので、値の設定に問題はないはずです。

于 2013-06-24T19:35:26.340 に答える