2013-12-20 137 views
2

我有一個WPF應用程序。它有一個分成4行的網格。在第2行中,我有一個datagrid,它的datacontext設置爲OrderBlock的一個對象。這一切工作正常。不過,我想將datagrid的列標題文本值之一綁定到我的視圖模型中的屬性。WPF與RelativeSource和祖先類型綁定

下面是我嘗試失敗的一個例子。

<DataGridTextColumn Header="{Binding RelativeSource={RelativeSource 
    AncestorType={x:Type Window}}, Path=ColumnHeadInfo}" 
    Binding="{Binding RejectReason}" IsReadOnly="True"/> 

回答

7

Window沒有一個叫ColumnHeadInfo財產,但我相信你的視圖模型是你的窗口的DataContext,這可能有這個屬性?

如果是這樣,請改爲嘗試這個辦法:

Path=DataContext.ColumnHeadInfo 

編輯:
因爲這本身並沒有解決你的問題:原因可能是該DataGridColumn不是可視化樹的一部分,因此找不到任何父元素,因爲它沒有任何元素。因此,RelativeSource AncestorType綁定不會產生任何結果。這應該在輸出窗口中顯示警告。或許,this link可能會對您有所幫助。

+0

是喲你是正確的假設。我把DataContext.ColumnHeaderInfo,但仍然無法正常工作。我檢查了我的視圖模型中的屬性ColumnHeaderInfo確實也有一個值。 – mHelpMe

+0

gehho是正確的,所以請檢查你的datacontext你的窗口是正確的。使用Snoop(http://snoopwpf.codeplex.com/) – blindmeis

+0

嗯,你的問題的原因可能是'DataGridColumn'不是可視樹的一部分,因此找不到任何父元素,因爲它沒有任何。因此,'RelativeSource AncestorType'綁定不會產生任何結果。這應該在輸出窗口中顯示警告。可能[此鏈接](http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/)可能有幫助您。 – gehho

2

而不是控件我使用「標記接口」來找到正確的數據上下文。

「標記接口」只是一句接口:

public interface IDataContextColumnHeadInfoMarker{} 

認爲至極,我知道有正確的datacontext標有接口

public partial class MyViewWiththeDatagrid : UserControl, IDataContextMarkerLadeSolldatenCommand 

,現在我可以使用該接口的RelativeSource綁定而不是控制或祖先級別,使事情更容易的一些情況:)

<DataGridTextColumn Header="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:IDataContextColumnHeadInfoMarker}}, Path=DataContext.ColumnHeadInfo}"