[英]WPF Binding to parent DataContext ignoring DataContext of the current element
[英]WPF Binding to parent DataContext
我們有一個帶有標准MVVM模式的WPF應用程序,利用Cinch(以及MefedMVVM)進行View - > ViewModel解析。 這很好用,我可以將相關控件綁定到ViewModel上的屬性。
在特定的視圖中,我們有一個Infragistics XamGrid。 此網格綁定到ViewModel上的ObservableCollection,並顯示相應的行。 但是,我在這個網格上有一個特定的列,我試圖將TextBox文本值綁定到父DataContext上的屬性,而不是ObservableCollection。 這種綁定失敗了。
我們在這里經歷了幾個選項,包括:
使用AncestorType跟蹤樹並綁定到父UserControl的DataContext,如此(從這個問題的答案很好,以及這個 )...
{Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}
指定ElementName並嘗試直接定位頂級控件。 如果您想閱讀有關使用ElementName的信息,請查看此處 。
使用UserControl資源中定義的“代理”FrameorkElement嘗試根據需要“傳入”上下文。 我們將元素定義如下,然后作為靜態資源引用...
<FrameworkElement x:Key="ProxyContext" DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource Self}}"></FrameworkElement>
在這種情況下,綁定會找到FrameworkElement,但不能訪問除此之外的任何內容(指定Path時)。
閱讀之后,很可能這是由樹外的Infragistics XamGrid構建列引起的。 但是,即使是這種情況,至少應該選擇2或3。
我們最后的想法是它與V-VM綁定有關,但即使使用Snoop,我們還沒有找到確切的問題。 我絕不是WPF綁定的專家所以任何指針都會受到贊賞。
編輯:我在這里找到了一些來自Infragistics的模板示例,我將嘗試。
編輯2:正如@Dtex所指出的,模板是可行的方法。 以下是與XamGrid一起使用的相關代碼段:
<ig:GroupColumn Key="CurrentDate">
<ig:GroupColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=DataContext.CurrentDateTest, RelativeSource={RelativeSource AncestorType=UserControl}}" />
</DataTemplate>
</ig:GroupColumn.HeaderTemplate>
<ig:GroupColumn.Columns>
我已經打開了XML ...你只需要添加你想要的列,然后關閉相關的標簽。
我不知道XamGrid
但這就是我用標准的wpf DataGrid
做的事情:
<DataGrid>
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding DataContext.MyProperty, RelativeSource={RelativeSource AncestorType=MyUserControl}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding DataContext.MyProperty, RelativeSource={RelativeSource AncestorType=MyUserControl}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
由於單元格模板中指定的TextBlock
和TextBox
將成為可視樹的一部分,因此您可以向上走,找到所需的控件。
由於這樣的事情,作為一般的經驗法則,我盡量避免盡可能多的XAML“欺騙”並盡可能保持XAML的愚蠢和簡單,並在ViewModel(或附加屬性或IValueConverters等)中完成其余工作。如果真的有必要)。
如果可能的話,我會給當前DataContext的ViewModel一個引用(即屬性)給相關的父ViewModel
public class ThisViewModel : ViewModelBase
{
TypeOfAncestorViewModel Parent { get; set; }
}
並直接綁定它。
<TextBox Text="{Binding Parent}" />
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.