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}}"/>