是否可以将TextBlock作为目标和源?
基本上我有一堆与其他实体有简单关系的实体(如Entity1 Knows Entity3,Entity3 WorksAt Entity2等)。
我有一个Link
课程,可以存储SourceEntity
,Relationship
和TargetEntity
个详细信息。
我希望能够做的是选择一个实体,然后显示与该实体相关的关系,并在关系名称下列出每个关系的目标实体。
选择实体后,ObservableCollection
会填充该特定实体的Links
(SelectedEntityLinks<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。
对不起,如果这有点罗嗦,但我希望它很清楚。任何指针/建议都会很棒。
答案 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>