2010-11-03 67 views
2

我在Silverlight中有一個綁定問題,我不能讓它工作...我有一個控制,其中有一個模型。Silverlight綁定問題嵌套控件

控制後面的代碼看起來像這樣

..... 
public ClientListingVM()//constructor 
     { 
      ClientListingViewModel model = new ClientListingViewModel();//this is my model 
      DataContext = model; 
      InitializeComponent(); 
     } 
..... 

型號後面的代碼看起來像這樣

.... 
    public ObservableCollection<FilterItemDefinition> FilterItemDefinitions 
     { 
      get { return _filterItemDefinitions; } 
      set 
      { 
       if (_filterItemDefinitions != value) 
       { 
        _filterItemDefinitions = value; 
       } 
       OnPropertyChanged("FilterItems"); 
      } 
     } 
.... 

在控制XAML我有這個

.... 
    <my:Filters Height="150" FilterItems="{Binding Path=FilterItemDefinitions}" Columns="{Binding ElementName=ClientGrid, Path=Columns}"/> 

.... 

,其中過濾器是用戶控制... 直到這裏一切正常...

落後於過濾器的代碼看起來像這樣

.... 
public partial class Filters : UserControl 
    { 
     public Filters() 
     { 
      InitializeComponent(); 

     } 
     private DependencyProperty FilterItemsProperty = DependencyProperty.Register("FilterItems", typeof(ObservableCollection<FilterItemDefinition>), typeof(Filters), new PropertyMetadata(null, new PropertyChangedCallback(OnChangef))); 
     public ObservableCollection<FilterItemDefinition> FilterItems 
     { 
      get 
      { 
       return (ObservableCollection<FilterItemDefinition>)GetValue(FilterItemsProperty); 
      } 
      set 
      { 
       SetValue(FilterItemsProperty, value); 
      } 
     } 
     private DependencyProperty ColumnsProperty = DependencyProperty.Register("Columns", typeof(ObservableCollection<DataGridColumn>), typeof(Filters), new PropertyMetadata(null, new PropertyChangedCallback(OnChangec))); 
     public ObservableCollection<DataGridColumn> Columns 
     { 
      get 
      { 
       return (ObservableCollection<DataGridColumn>)GetValue(ColumnsProperty); 
      } 
      set 
      { 
       SetValue(ColumnsProperty, value); 
      } 
     } 
     public static void OnChangef(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
     } 
     public static void OnChangec(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
     } 
    } 
.... 

和XAML看起來像這樣

.... 
<ListBox x:Name="myListBox" ItemsSource="{Binding Path=FilterItems, Mode=TwoWay}" > 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <my:FilterItem Columns="{Binding Source={StaticResource DataContextProxy},Path=DataSource.Columns}"/> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
.... 

所以這裏的問題是:

ListBox中的ItemSource勢必FilterItems。 ..但過濾器DataContext是ClientListingViewModel ...並且該模型沒有FilterItems屬性。

如果過濾器構造我設置FiltersViewModel或者我說的DataContext =本的DataContext將擁有財產FilterItems和結合willwork確定..但是從ClientListingViewModel財產FilterItemDefinitions不會得到我的控制過濾器...

我想DataContext FiltersControl是他的DataContext或背後的代碼..但在同一時間綁定他的屬性與父控制模型工作.. 我相信這是可能的,我是這樣做的方式不對..可以有人請幫助我... 10x

回答

2

離開你的現有DataContext就是你不想做的事情,比如DataContext = this。相反,結合ItemsSource這樣的: -

ItemsSource="{Binding Path=Parent.FilterItems, ElementName=LayoutRoot}" 

這裏假設你有命名爲LayoutRoot默認的根元素。因此該根的Parent將是您的Filters用戶控件,它具有FilterItems屬性。順便說一句這個屬性的雙向綁定並沒有多大意義。