【发布时间】:2019-09-26 12:46:36
【问题描述】:
是否可以将多个源绑定到元素的依赖属性?
在我的例子中,我有一个组合框控件,它的 ItemSource 属性由 viewmodel 填充,但是 Text 属性绑定到 ItemsControl 使用的模型。
谢谢。
xaml sn-p:
<DataTrigger Binding="{Binding EnumType}" Value="6">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<ComboBox
x:Name="ListOfItems"
IsDropDownOpen="{Binding IsDropDownOpen,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"
StaysOpenOnEdit="True"
IsTextSearchEnabled="False"
IsReadOnly="False"
IsEditable="True"
ItemsSource="{Binding Path=FilteredSource, Source={StaticResource ItemsVM} ,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
Text="{Binding Path=Result, UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="{Binding Path=Item.Name, Source={StaticResource ItemsVM}}" >
<ComboBox.Triggers>
<EventTrigger RoutedEvent="TextBoxBase.TextChanged">
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsDropDownOpen">
<DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:0" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ComboBox.Triggers>
</ComboBox>
</DataTemplate>
</Setter.Value>
</Setter>
【问题讨论】:
-
答案是肯定的。不知道你会怎么做或者你想解决什么问题,但是如果它是一个属性,你可以多重绑定,或者使用各种方法(如相对源)来获取与数据上下文不同的视图模型。您应该编辑您的问题,以便清楚您要做什么。
-
可以设置每个绑定的
Source。DisplayMemberPath应该设置为string顺便说一句:DisplayMemberPath="Name"。 -
@Andy 谢谢,这意味着元素的整个属性可以与不同的源或不同的视图模型绑定。我同意这听起来有点奇怪,我有一个非常奇怪的遗留代码,所以重构需要很长时间,我正在寻找一种方法。
-
假设您有一个带有组合框列的数据网格,那么您的每一行的数据上下文就是从 itemssource 呈现给它的项目 - 行视图模型。然而,您通常会拥有所有行都将使用的选项集合。所以这是有道理的,而不是奇怪的。仍然不确定你在这里问什么。但是 Magnus 是正确的,您遇到的一个问题是,在组合中以“路径”结尾的任何属性都应该是一个表示属性路径的字符串 - 通常只是一个属性名称。
-
@Nazim:
DisplayMemberPath没有DataContext。它只是指定属性的名称。同样,绑定到这个属性是没有意义的。