簡體   English   中英

如何確定 WPF 中 RelativeSource 的 AncestorLevel?

[英]How do I determine AncestorLevel for RelativeSource in WPF?

在使用相當標准的 MVVM 模式的 WPF 應用程序中,我需要從DataTable中的一行(即在可視化樹的深處)綁定到整個 window 的數據上下文。 我假設這樣做的唯一方法是使用Mode=RelativeSource ,但它要求我指定AncestorLevel

  1. 如何確定AncestorLevel
  2. 當我知道只有一個 window 時,為什么還要指定這個? 換句話說,為什么我不能簡單地指定我想要綁定的類型並讓綁定引擎逆向樹,直到找到所需類型的第一個 object?
  3. 如果我確實弄清楚了AncestorLevel ,這不會使代碼變脆嗎? (如果我改變視覺元素的嵌套,它顯然會中斷。)

如果沒有涉及RelativeSource的好的解決方案,我想我可以采取另一種方法,並通過邏輯樹將頁面級屬性向下“傳播”到列表中的各個項目。 這有一個公認的模式嗎?

RelativeSource是否曾經有過一種僅按類型搜索樹的方法(或者我在想象這個)?

看到我的問題,那里提出了類似的問題:
WPF 尋找綁定的祖先

簡而言之 - 當您給出祖先類型時,它會向上搜索元素樹,直到找到該給定類型的祖先(級別 1)。 如果您需要向上搜索兩個級別(例如,您在網格中有一個網格並且您的目標是“外部”網格),您指定AncestorLevel=2並且祖先是該特定類型的第二個元素,同時遍歷元素樹。

如何確定 AncestorLevel?

通過查看可視化樹並計算特定類型父元素的出現次數。 雖然只能有一個頂級父 window。

當我知道只有一個 window 時,為什么還要指定這個?

你不必。 只指定這樣的AncestorType非常好,也很常見:

{Binding SomePropertyOfTheWindow, RelativeSource={RelativeSource AncestorType=Window}}" />

如果我確實找出了 AncestorLevel,這不會使代碼變脆嗎? (如果我改變視覺元素的嵌套,它顯然會中斷。)

是的,這是正確的,但這就是您告訴綁定引擎要綁定到特定類型的特定項目的方式 - 假設有幾個可供選擇。

雖然這不是綁定到一個Relative 源,而是另一種沒有Relative 和類型復雜性的綁定方式。

另一個選項,而不是綁定到特定類型的控件,您可以在 xaml 中使用 x:Name 命名您的控件。 然后,您可以直接綁定到該控件和其上的屬性。 前任:

<SomeControl x:Name="IWantThisControl" />

[bunch of other controls]

<YourOtherControl ThisControlProperty={Binding ElementName=IWantThisControl, Path=PropertyOnTheOtherControl}" />

使用綁定到 ElementName 引用時,控件的嵌套級別無關緊要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM