数据绑定到multiBinding的值

eca*_*ell 2 wpf xaml multibinding

也许我不太了解多重绑定.

我的viewmodel上有一个名为OfficeDisplayName的属性,该属性写入数据库.

这是一个基于人的FirstName,Lastname和office位置的连接字段.

所以我在textBlock上有一个多绑定...没有biggie ...工作得很漂亮......但是如何将这个连接的完整值绑定到OfficeDisplayName属性?我是否必须有一个绑定到多重绑定文本框的隐藏元素?我已经看到了几个几乎我需要的例子,但只是不回答concat数据绑定问题.

Jak*_*sen 7

一种方法是让textblock直接绑定到OfficeDisplayName然后将连接逻辑OfficeDisplayName放在viewmodel 的属性中,而不是放在MultiValueConverter.因此,当FirstName,LastName或office位置中的某个属性发生更改时,您将触发该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}); }
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是将您的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>
Run Code Online (Sandbox Code Playgroud)

转换器:

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
}
Run Code Online (Sandbox Code Playgroud)