silverlight绑定问题嵌套控件

时间:2010-11-03 10:57:15

标签: silverlight data-binding mvvm

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

....

其中Filters是用户控件... 直到这里一切正常......

过滤器背后的代码如下所示

....
 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 ...但Filters DataContext是ClientListingViewModel ...并且该模型没有FilterItems属性。

如果在Filters构造函数中我设置了一个FiltersViewModel,或者我说DataContext = this,Filters DataContext将具有属性FilterItems,绑定将正常工作..但ClientListingViewModel的属性FilterItemDefinitions将无法控制...

我希望FiltersControl的DataContext成为他的DataContext或后面的代码..但同时他的属性与父控件模型的绑定工作.. 我确信这是可能的,我是以错误的方式做的..有人可以帮助我... 10X

1 个答案:

答案 0 :(得分:2)

单独保留现有的DataContext,您不希望做DataContext = this之类的事情。而是像这样绑定ItemsSource: -

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

这假设您具有名为LayoutRoot的默认根元素。因此,此根的Parent将是您的Filters用户控件,其具有FilterItems属性。 BTW对这个属性的双向绑定没有多大意义。