XAML对象可以是一个绑定的源,也可以是另一个绑定的目标?

时间:2011-01-07 11:51:51

标签: wpf xaml binding

是否可以将TextBlock作为目标和源?

基本上我有一堆与其他实体有简单关系的实体(如Entity1 Knows Entity3,Entity3 WorksAt Entity2等)。

我有一个Link课程,可以存储SourceEntityRelationshipTargetEntity个详细信息。

我希望能够做的是选择一个实体,然后显示与该实体相关的关系,并在关系名称下列出每个关系的目标实体。

选择实体后,ObservableCollection会填充该特定实体的LinksSelectedEntityLinks<Link>)。

因为每个实体可以与多个目标实体具有相同的关系(Entity1可以知道Entity3和Entity4,例如。),我创建了一个方法GetThisRelationshipEntities(),它将关系名称作为参数,通过SelectedEntityLinks查找与参数匹配的关系名称,并返回ObservableCollection与该关系的目标实体。

在我的xaml中,我有一个WrapPanel来显示TextBlock中的每个关系名称:

<TextBlock x:Name="relationship" Text="{Binding Path=Relationship.Name}" />

然后在另一个Textblock下面显示GetThisRelationshipEntities(String relationshipName).

的结果

所以我希望“关系”TextBlock从我上面显示的绑定中获取Text,还要将其Text作为参数提供给GetThisRelationshipEntities()方法,我已将其添加到{{ 1}}作为ObjectDataProvider。

对不起,如果这有点罗嗦,但我希望它很清楚。任何指针/建议都会很棒。

3 个答案:

答案 0 :(得分:0)

听起来你应该使用IValueConverter创建一个值转换器类,并使用属性作为关系表。 做的时候

<TextBlock x:Name="relationship" Text="{Binding Path=Relationship.Name}" />

你要添加

<TextBlock x:Name="relationship" Text="{Binding Path=Relationship.Name, Converter={StaticResource myRelationConverter}}" />

Convert()方法中你可以做任何你想要的疯狂事情。

答案 1 :(得分:0)

我不完全确定我得到了你想做的事,但我建议尝试将绑定模式设置为TwoWay。

<TextBlock x:Name="relationship" Text="{Binding Path=Relationship.Name}"
             Mode=TwoWay />

虽然现在我考虑过它,但它可能是默认选项,因此每次更新源时,您也可以尝试在TextBlock上调用GetThisRelationshipEntities()函数:

private void relationship_SourceUpdated(object sender, DataTransferEventArgs e)
{
    //To DO: whatever update you wanna make
}

答案 2 :(得分:0)

您的措辞不准确:DependencyObjects不是DependencyObjects作为绑定的来源或目标,而是DependencyProperty属性。普通属性只能是绑定中的源,但<TextBox Text="{Binding Path=Name}" Name="txtName" /> <Label Content="{Binding ElementName=txtName, Path=Text}" /> 既可以作为源也可以作为目标。例如在

Text

TextBox的{​​{1}}属性是绑定Name中某些DataContext属性的目标,同时它是绑定到Content的{​​{1}}属性。方法调用的参数不是属性,因此它不能是绑定中的源或目标。在您的情况下,最简单的解决方案可能是处理Label事件并从那里调用您的方法。使用Martin建议的TextBlock.TextChanged也是一种选择。

编辑:这是一个演示使用ValueConverter事件的方法的工作示例。每次更改内容时,它都会将TextChanged的内容写入TextBox。要绑定到方法的结果,您可以让事件处理程序将其结果写入属性,然后绑定到该属性。

MainWindow.xaml:

Console

MainWindow.xaml.cs:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel Orientation="Vertical">
        <TextBox Name="textBox1" TextChanged="textBox1_TextChanged" />
    </StackPanel>
</Window>