2012-07-05 43 views
3

我有一個相當複雜的數據樹,我在WPF UserControl中顯示,控件使用DataTemplates創建並鏈接各種UI元素,直到樹中的各種數據。下面是其中涉及的項目是在一個ItemsControl坐在畫布上顯示的列表(非常)簡單的例子,每個元素都代表一個文本框:WPF:從數據上下文對象獲取DataTemplate元素

<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <TextBox 
      Text="{Binding ...}" 
      Canvas.Left="{Binding ...}" 
      Canvas.Top="{Binding ...}" 
     /> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 

現在已經我的用戶,其中我有內部發生的事件對其中一個列表項的引用,我想將焦點設置爲它後面的TextBox項。是否有一種簡單的方法從其數據上下文綁定的數據對象中獲取TextBox元素?或者我必須自己手動走完整個視覺樹?

我意識到我可以把一個成員放入數據元素本身,並使用觸發器來做它我正在做的任何事情,但在我的情況下,它會需要一個額外的抽象層,我真的很想避免如果可能的話。

回答

1

正如你所說的,如果你不能直接成員添加到您正在使用的物品類別中,我認爲它是一個內置的類型,你不必訪問,你必須創建一個適當的視圖模型訪問像

<Trigger Property="IsFocused" Value="True"> 
    <Setter TargetName="myTextBox" Property="FocusManager.FocusedElement" Value="{Binding IsTextBoxFocused}" /> 
</Trigger> 

這是另一個抽象層,但您總是會發現使用您有權訪問的View Model很重要。

+0

這是一個有點羞恥真的,因爲這意味着如果你正在寫一個通用的控制,並且希望用戶能夠指定綁定的數據元素,那麼你可以不只是直接綁定到他們的數據。控件必須在內部封裝它們的數據,以便它可以添加自定義數據,例如這個標誌。呃,不管。謝謝你的幫助! –

+0

您剛剛定義了View Model的功能。這是因爲「生產級」控制需要更多的綁定和更復雜的行爲。如果沒有視圖模型來將視圖與用戶數據分開,那將會非常令人困惑。 – jimmyjambles