【问题标题】:silverlight binding problem nested controlssilverlight 绑定问题嵌套控件
【发布时间】:2011-05-04 10:25:06
【问题描述】:

我在 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 或背后的代码.. 但同时他的属性与父控件模型的绑定工作.. 我确信这是可能的,我做错了..有人可以帮我吗... 10 倍

【问题讨论】:

    标签: silverlight data-binding mvvm


    【解决方案1】:

    不管你现有的 DataContext,你不想做像DataContext = this 这样的事情。而是像这样绑定ItemsSource:-

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

    这假设您有默认的根元素命名为LayoutRoot。因此,这个根的Parent 将是您的Filters 用户控件,它具有FilterItems 属性。顺便说一句,对这个属性进行双向绑定没有多大意义。

    【讨论】:

      猜你喜欢
      • 2011-09-03
      • 2011-08-24
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      相关资源
      最近更新 更多