代码之家  ›  专栏  ›  技术社区  ›  ecathell

数据绑定到多重绑定的值

  •  2
  • ecathell  · 技术社区  · 14 年前

    也许我不太懂多重绑定。

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

    这是一个基于人员的名字、姓氏和办公室位置的串联字段。

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

    1 回复  |  直到 14 年前
        1
  •  7
  •   Jakob Christensen    14 年前

    一种方法是让textblock直接绑定到 OfficeDisplayName 然后将级联逻辑放入 OfficeDisplayName公司 属性,而不是 MultiValueConverter 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}); }
        }
    }
    

    另一种方法是将viewmodel本身作为参数传递给 多值转换器 . 在转换器中,可以设置 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
    }