2011-01-07 57 views
0

是否可以将TextBlock作为目标和源?XAML对象可以作为一个绑定的源和另一个绑定的目标吗?

基本上我有一堆具有到其它实体的简单关系(如ENTITY1谁知ENTITY3,ENTITY3 WorksAt ENTITY2等)

我有一个Link类存储SourceEntityRelationshipTargetEntity细节实体。

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

当选择一个实体时,ObservableCollection填充该特定实体的LinksSelectedEntityLinks<Link>)。

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

在我的XAML中我有一个WrapPanel在TextBlock中显示每个关系名:

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

然后说下另一个文本块应显示GetThisRelationshipEntities(String relationshipName).

结果让我想要的“关系” TextBlock既可以从我上面显示的绑定中获取文本,也可以将其Text作为参数提供给GetThisRelationshipEntities()方法,我已将其作为ObjectDataProvider添加到<UserControl.Resources>

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

回答

0

对我来说,听起来你应该使用IValueConverter和属性关系表创建一个值转换器类。 在做

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

你会在Convert()方法,你可以做你想做的任何疯狂的事情添加

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

+0

感谢马丁,我会考虑的价值转换。但有一个问题,如果我使用的是一个名为Convert()的方法,我如何从TextBlock中将Relationship.Name传递给它?或者是使用Converter = {StaticResource myRelationConverter}会做什么? TextBlock当前显示的关系。名称是显示正确数据的关键。如果我能弄清楚如何找回它! – iambic77 2011-01-07 13:29:39

+0

转换器被称为绑定操作的一部分。 1.检索Relationship.Name的值2.通过框架将值传递给给定值转换器convert方法3.将Convert方法的返回值写入Text属性 – Martin 2011-01-13 15:33:01

+0

@ iambic77参见上面的 – Martin 2011-01-13 16:43:37

0

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

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

虽然现在我想想,这可能是默认选项,所以你也可以尝试调用GetThisRelationshipEntities()函数在TextBlock的,每次它的时间源更新:

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

您的措辞是不正确的:它不是DependencyObjects,它们是DependencyObjects的绑定的来源或目标,而是的属性。普通属性只能是绑定中的源,但DependencyProperty既可以作为源,也可以作为目标。例如,在

<TextBox Text="{Binding Path=Name}" Name="txtName" /> 
<Label Content="{Binding ElementName=txtName, Path=Text}" /> 

TextBoxText属性是在DataContext结合到一些Name属性的目标,并在同一时间,它是结合至LabelContent属性的来源。方法调用的参数不是属性,因此它不能作为绑定中的源或目标。在你的情况下,最简单的解决方案可能是处理TextBlock.TextChanged事件,并从那里调用你的方法。马丁建议使用ValueConverter也是一种选择。

编辑:下面是一个工作示例,演示了使用TextChanged事件的方法。每当你改变一些东西时,它会将TextBox的内容写入Console。要绑定到你的方法的结果,你可以让事件处理程序将其结果写入一个属性,然后绑定到该属性。

MainWindow.xaml:

<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> 

MainWindow.xaml.cs:

using System; 
using System.Windows; 
using System.Windows.Controls; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void textBox1_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     Console.WriteLine(this.textBox1.Text); 
    } 
    } 
} 
相关问题