【问题标题】:Binding multiple source an element's dependency properties in wpf在wpf中绑定多个源元素的依赖属性
【发布时间】: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>

【问题讨论】:

  • 答案是肯定的。不知道你会怎么做或者你想解决什么问题,但是如果它是一个属性,你可以多重绑定,或者使用各种方法(如相对源)来获取与数据上下文不同的视图模型。您应该编辑您的问题,以便清楚您要做什么。
  • 可以设置每个绑定的SourceDisplayMemberPath应该设置为string顺便说一句:DisplayMemberPath="Name"
  • @Andy 谢谢,这意味着元素的整个属性可以与不同的源或不同的视图模型绑定。我同意这听起来有点奇怪,我有一个非常奇怪的遗留代码,所以重构需要很长时间,我正在寻找一种方法。
  • 假设您有一个带有组合框列的数据网格,那么您的每一行的数据上下文就是从 itemssource 呈现给它的项目 - 行视图模型。然而,您通常会拥有所有行都将使用的选项集合。所以这是有道理的,而不是奇怪的。仍然不确定你在这里问什么。但是 Magnus 是正确的,您遇到的一个问题是,在组合中以“路径”结尾的任何属性都应该是一个表示属性路径的字符串 - 通常只是一个属性名称。
  • @Nazim:DisplayMemberPath 没有DataContext。它只是指定属性的名称。同样,绑定到这个属性是没有意义的。

标签: c# wpf xaml mvvm combobox


【解决方案1】:

您可以像当前对 ItemsSource 属性所做的那样设置每个绑定的 Source

ItemsSource="{Binding Path=FilteredSource, Source={StaticResource ItemsVM}}"

如果不这样做,框架将在ComboBox 的当前DataContext 中查找FilteredSource 属性。

顺便说一下,DisplayMemberPath 属性应该设置为 string,它指定了 ItemsSource 中项目的属性名称:

DisplayMemberPath="Name"

你不应该绑定到这个属性。

ItemsSource 绑定的UpdateSourceTrigger 属性设置为PropertyChanged,或将Mode 设置为TwoWay 也是没有意义的,因为控件不会设置源属性。

【讨论】:

  • 如果我不在这里绑定“DisplayMemberPath”,它会直接采用没有名称属性的当前“DataContext”。有没有办法将 'ItemsSource' 和 'DisplayMemberPath' 绑定到 ItemVM,谢谢
  • 没有。 DisplayMemberPath 始终引用当前 ItemsSource 中的项目的属性。
猜你喜欢
  • 2011-12-03
  • 2012-11-08
  • 2014-08-31
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多