2

たぶん、私はマルチバインディングを完全に把握していません。

データベースに書き込まれる OfficeDisplayName というビューモデルのプロパティがあります。

これは、個人の FirstName、Lastname、およびオフィスの場所に基づいて連結されたフィールドです。

だから私はtextBlockにマルチバインディングを持っています...大したことはありません...美しく動作します...しかし、この連結の完全な値をOfficeDisplayNameプロパティにバインドするにはどうすればよいですか? マルチバウンド テキスト ボックスにバインドする非表示の要素が必要ですか? 私が必要とするほとんどの例をいくつか見てきましたが、連結データバインディングの質問には答えていません。

4

1 に答える 1

8

1 つの方法は、textblock を に直接バインドさせてからOfficeDisplayName、連結ロジックを のOfficeDisplayName代わりにビューモデルのプロパティに配置することMultiValueConverterです。したがって、FirstName、LastName、またはオフィスの場所のプロパティのいずれかが変更されるたびに、PropertyChangedイベントを発生させOfficeDisplayNameます。つまり、次の行に沿ったものです。この方法では、コンバーターはまったく必要ありません。

class YourViewModel : ViewModel
{
    string _firstName;

    public string FirstName
    {
        get { return _firstName; }
        set
        {
            if (_firstName != value)
            {
                _firstName = value;
                OnPropertyChanged("FirstName");
                OnPropertyChanged("OfficeDisplayName");
            }
        }
    }

    // More properties here
    // ...

    public string OfficeDisplayName
    {
        get { return String.Join(" ", new string[] { _firstName, _lastName, _officeLocation}); }
    }
}

もう 1 つの方法は、viewmodel 自体をパラメータとして に渡すことMultiValueConverterです。コンバーターでは、の値をOfficeDisplayName直接設定できます。この方法は少し「ハックっぽい」と思いますが、好みの問題です。コードは次のようになります。

XAML でのバインディング:

<MultiBinding Converter="{StaticResource theConverter}" Mode="OneWay">
    <Binding /> <!-- Pass the datacontext as the first parameter -->
    <Binding Path="FirstName" />
    <Binding Path="LastName" />
</MultiBinding>

コンバーター:

class TheMultiValueConverter : IMultiValueConverter
{
    #region IMultiValueConverter Members

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var viewModel = values[0] as TheViewModel;
        var ret = String.Join(" ", values.Skip(1).Cast<string>().ToArray());
        viewModel.OfficeDisplayName = ret;
        return ret;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}
于 2010-07-22T14:05:55.300 に答える