也许我不太了解多重绑定。
我的视图模型上有一个名为 OfficeDisplayName 的属性,该属性已写入数据库。
这是一个基于个人名字、姓氏和办公地点的串联字段。
所以我在 textBlock 上进行了多重绑定...没什么大不了的...工作得很好...但是如何将此串联的完整值绑定到 OfficeDisplayName 属性?我是否必须有一个绑定到多绑定文本框的隐藏元素?我已经看到了几个几乎是我需要的示例,但只是不回答 concat 数据绑定问题。
也许我不太了解多重绑定。
我的视图模型上有一个名为 OfficeDisplayName 的属性,该属性已写入数据库。
这是一个基于个人名字、姓氏和办公地点的串联字段。
所以我在 textBlock 上进行了多重绑定...没什么大不了的...工作得很好...但是如何将此串联的完整值绑定到 OfficeDisplayName 属性?我是否必须有一个绑定到多绑定文本框的隐藏元素?我已经看到了几个几乎是我需要的示例,但只是不回答 concat 数据绑定问题。
一种方法是让文本块直接绑定到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
}