[WPF] How to bind to data when the datacontext is not inherited

原文地址:http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/ide

WPF的DataContext傳遞性,的確很是好用。可是在某些特定的環境下,元素並不能從視覺樹(VisualTree)向上獲取傳遞,好比未指定數據源和Popup性質的浮動層,特別是菜單功能。佈局

一些簡單的地方,好比你作數據綁定,若是你有一個ViewModel,內部有學生列表,同時還備好了一個ICommand,每個學生項想直接調用這個ICommand是不可行的,通常是經過兩種方式獲取到ViewModel,以後再綁定ICommand。方法1是獲取ElementName而後讀取控件的DataContext。第二種方式是使用RelativeSource獲取上級控件的數據源。這兩種方法都有侷限性,佈局改變影響大,甚至寫法怪異。spa

有一個很好的方法那就是,先把可能用到的數據,做爲資源,咱們先備好一個容器存着。code

public class BindingProxy : Freezable
{
    #region Overrides of Freezable
 
    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }
 
    #endregion
 
    public object Data
    {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }
 
    // Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}

資源的定義也是比較簡單的,在適當的位置,準備好你的數據源。blog

<DataGrid.Resources>
    <local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>

最後,在須要引用數據的地方,執行綁定。資源

<DataGridTextColumn Header="Price" Binding="{Binding Price}" IsReadOnly="False"
                    Visibility="{Binding Data.ShowPrice,
                                         Converter={StaticResource visibilityConverter},
                                         Source={StaticResource proxy}}"/>
相關文章
相關標籤/搜索