2

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

我的视图模型上有一个名为 OfficeDisplayName 的属性,该属性已写入数据库。

这是一个基于个人名字、姓氏和办公地点的串联字段。

所以我在 textBlock 上进行了多重绑定...没什么大不了的...工作得很好...但是如何将此串联的完整值绑定到 OfficeDisplayName 属性?我是否必须有一个绑定到多绑定文本框的隐藏元素?我已经看到了几个几乎是我需要的示例,但只是不回答 concat 数据绑定问题。

4

1 回答 1

8

一种方法是让文本块直接绑定到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}); }
    }
}

另一种方法是将您的视图模型本身作为参数传递给您的MultiValueConverter. 在您的转换器中,您可以直接设置 的值OfficeDisplayName。我认为这种方式有点“hack-ish”,但这是一个品味问题。您的代码如下所示:

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 回答