【问题标题】:Databinding to the value of a multiBinding数据绑定到 multiBinding 的值
【发布时间】:2010-07-22 12:53:24
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: wpf xaml multibinding


    【解决方案1】:

    一种方法是让文本块直接绑定到OfficeDisplayName,然后将连接逻辑放在视图模型的OfficeDisplayName 属性中,而不是放在MultiValueConverter 中。因此,当 FirstName、LastName 或办公室位置中的任何一个属性发生更改时,您会为 OfficeDisplayName 触发 PropertyChanged 事件 - 即类似以下内容。这样你就完全不需要转换器了:

    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
    }
    

    【讨论】:

    • 好的……这真的让我开始了,所以我投票给你。但是......呵呵......我需要将此值保存到数据库中,但同时确保我正在从数据库中读取准确的值......所以我必须在 setter 中做一些事情......我我猜从长远来看,我可能不得不通过视图模型。
    • +1 for this -
    猜你喜欢
    • 2011-06-07
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2021-02-15
    • 2010-12-02
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    相关资源
    最近更新 更多