听起来您正在寻找MultiBinding,并与IMultiValueConverter 配对。
话虽如此,我强烈建议您在 ViewModel 中确定所需的值,因为您已经拥有所有需要的属性,并且您知道它们何时以及如何更改。获得派生属性后,只需使用常规绑定在视图中绑定到它。使用 MultiBindings 通常会破坏您的关注点分离,因为您最终会将特定逻辑添加到真正应该在 ViewModel 中的转换器中。我确实发现 MultiBindings 不可或缺的一个案例是在组标题模板中(即对于 DataGrid)。从 ViewModel 获取值是非常不可能的,因为您不知道您有多少组或它们在运行时将包含什么,因为移动部件太多。在这种情况下,MultiBindings 很棒。
另一方面,如果您只是针对您在设计时了解的特定元素,则通常应避免使用 MultiBinding 出于上述原因。此外,与常规绑定相比,MutliBinding 相当冗长,使您的 XAML 更难阅读,从而产生更大的潜在错误并限制未来的可扩展性和可维护性。
但如果必须,这里有一个简单的例子:
XAML
<Window x:Class="testapp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:testapp"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:MyMultiConverter x:Key="multiTextConverter"/>
</Window.Resources>
<Grid>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource multiTextConverter}">
<Binding Path="someProp"/>
<Binding Path="someOtherProp" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Grid>
</Window>
转换器
public class MyMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType,
object parameter, CultureInfo culture)
{
string ret = null;
if(values.Count() > 1)
{
string value1 = values[0] as string;
string value2 = values[1] as string;
ret = value1 + value2;
}
return ret;
}
public object[] ConvertBack(object value, Type[] targetTypes,
object parameter, CultureInfo culture)
{
}
}
现在,如果您要绑定到List,并且假设您关心何时添加或删除项目,您将需要使用ObservableCollection,因为它实现了INotifyCollectionChanged 接口see here。但这还不够,因为绑定不会订阅该事件。您将需要在 DataContext(ViewModel?)中收听集合的变化。然后创建一些虚拟属性,当集合更改时,只需增加虚拟属性(当然使用 INotifyPropertyChanged)并在多重绑定中使用该属性作为第三个绑定。这样,TextBlock 文本将在属性更改或您的列表更改时得到更新。
如果您不关心集合中的变化,只有当您分配一个全新的集合时,提供的示例才会按原样工作。