2012-06-01 15 views
0

在下面的圖片中,爲什麼FindAncestor需要,爲什麼AncestorType不是UserControl?何時使用FindAncestor?

如果用戶控件是一個StackPanel內,將AncestorType是StackPanel的?

換句話說,什麼是父控件有綁定到viewmodel.Message辦?爲什麼綁定中需要其他所有xaml?

WPF binding

+0

不應該Base ViewModel是抽象的,因此不是任何人的DataContext? –

+0

也許Base不是一個好的描述。如果兩者都是「員工」視圖和ViewModel,這是否有所作爲? – 4thSpace

+0

那麼,你的圖是misleasig,它看起來好像ViewModel1與Base-ViewModel相關,例如,它從它繼承。如果情況並非如此,我認爲這些箱子應該是分開的。 –

回答

1

它不需要指定AncestorType = UserControl,因爲這是默認的上下文。如果省略「RelativeSource」參數,它將綁定到本地DataContext。

在這種情況下,用戶控件,它包含在必須有不同的DataContexts窗口。由於UserControl通常在設計時不知道其父級的名稱,因此通常可以假設它只會在單個窗口中,並使用RelativeSource爲窗口的DataContext創建綁定,如圖所示。

這可能很常見,因爲在應用程序中,Window可能有一個DataContext作爲整個應用程序的信息,但是當前的UserControl可能專注於特定的一段數據(例如Employee)。在這種情況下,所有默認綁定都指向Employee,但UserControl可能也想綁定到父級DataContext中的某些東西。

0

在這種情況下,開發者只知道那有他們在尋找DataContext的對象是一個窗口。例如,如果在一個堆棧面板上設置了一個數據上下文,並且您想從該數據上下文中獲取某些內容,那麼您將使用AncestorType = Window。由於有兩個數據上下文,並且用戶想要將某些內容綁定到外部,所以使用了FindAncestor。

1

爲什麼需要FindAncestor?
這裏使用FindAncestor來訪問Window對象以獲得對Window對象的DataContext的訪問。

爲什麼AncestorType不是UserControl?
因爲UserControl對象的DataContext可能與Window對象的DataContext不同。
通常它是一樣的,但你可以重新定義它。

如果用戶控件是一個StackPanel內,將AncestorType是StackPanel的?
沒有,如果StackPanel本身在你的窗口。
不要忘記,您的目標是包含您想要的DataContext的圖形對象的類型。

相關問題