2011-01-07 58 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); 
    } 
    } 
} 
相關問題