簡體   English   中英

WPF綁定到父DataContext

[英]WPF Binding to parent DataContext

我們有一個帶有標准MVVM模式的WPF應用程序,利用Cinch(以及MefedMVVM)進行View - > ViewModel解析。 這很好用,我可以將相關控件綁定到ViewModel上的屬性。

在特定的視圖中,我們有一個Infragistics XamGrid。 此網格綁定到ViewModel上的ObservableCollection,並顯示相應的行。 但是,我在這個網格上有一個特定的列,我試圖將TextBox文本值綁定到父DataContext上的屬性,而不是ObservableCollection。 這種綁定失敗了。

我們在這里經歷了幾個選項,包括:

  1. 使用AncestorType跟蹤樹並綁定到父UserControl的DataContext,如此(從這個問題的答案很好,以及這個 )...

     {Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}} 
  2. 指定ElementName並嘗試直接定位頂級控件。 如果您想閱讀有關使用ElementName的信息,請查看此處

  3. 使用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>

由於單元格模板中指定的TextBlockTextBox將成為可視樹的一部分,因此您可以向上走,找到所需的控件。

由於這樣的事情,作為一般的經驗法則,我盡量避免盡可能多的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.

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