【问题标题】:WP7 Dependency Property Binding ProblemsWP7 依赖属性绑定问题
【发布时间】:2010-10-18 06:18:28
【问题描述】:

我有一个包含列表框的用户控件。我想绑定到列表框的选定项属性,所以我创建了一个依赖属性。

        public HousePrice SelectedItem
        {
        get 
        { 
            return (HousePrice)GetValue(SelectedItemProperty); 
        }
        set
        {
            SetValue(SelectedItemProperty, value);
        }
    }

    public static readonly DependencyProperty SelectedItemProperty =
        DependencyProperty.Register(
            "SelectedItem",
            typeof(HousePrice),
            typeof(HorizontalListBox),
            null
        );

    private void MainListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (e.AddedItems.Count > 0)
        {
            SelectedItem = (HousePrice)e.AddedItems[0];
        }
    }

我像这样绑定到属性:

   <UserControls:HorizontalListBox
   DataContext="{Binding HousePrices}"
       SelectedItem="{Binding SelectedPriceFrom, Mode=TwoWay}" >
   </UserControls:HorizontalListBox>

我的视图模型属性:

        private HousePrice _selectedPriceFrom;
    public HousePrice SelectedPriceFrom
    {
        get
        {
            return _selectedPriceFrom;
        }
        set
        {
            _selectedPriceFrom = value;
            NotifyOfPropertyChange("SelectedPriceFrom");
        }
    }

我可以看到 dp 正在设置,但绑定到我的 vm 属性似乎不起作用。

编辑:

我认为问题在于将 UserControl 的 DataContext 设置为 HousePrices(我的 VM 中的一个属性),并将 SelectedItem 设置为我的 VM 中的另一个属性。我猜它试图找到相对于 HousePrices 的 SelectedItem。

另一个怪癖是我使用的是 Caliburn Micro 框架。

有什么想法吗?

【问题讨论】:

    标签: windows-phone-7 dependency-properties


    【解决方案1】:

    现已修复。

    我为 ItemsSource 添加了另一个依赖属性,并确保将所有 DP 属性更改事件连接到用户控件属性。

    这是用户控件的使用方式:

        <UserControls:HorizontalListBox
           ItemsSource="{Binding PriceFromList}"
           SelectedItem="{Binding SelectedPriceFrom, Mode=TwoWay}">
        </UserControls:HorizontalListBox>
    

    这是我连接 DP 的方法:

        /// <summary>
        /// Item Source
        /// </summary>
        public ObservableCollection<ObjWithDesc> ItemsSource
        {
            get 
            {
                return (ObservableCollection<ObjWithDesc>)GetValue(ItemsSourceProperty); 
            }
            set
            {
                SetValue(ItemsSourceProperty, value);
            }
        }
    
        public static readonly DependencyProperty ItemsSourceProperty =
            DependencyProperty.Register(
                "ItemsSource",
                typeof(ObservableCollection<ObjWithDesc>),
                typeof(HorizontalListBox),
                new PropertyMetadata(OnItemsSourcePropertyChanged)
            );
    
        static void OnItemsSourcePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            ((HorizontalListBox) obj).OnItemsSourcePropertyChanged(e);
        }
    
        private void OnItemsSourcePropertyChanged(DependencyPropertyChangedEventArgs e)
        {
            ObservableCollection<ObjWithDesc> objWithDescList = (ObservableCollection<ObjWithDesc>)e.NewValue;
    
            MainListBox.ItemsSource = objWithDescList;
        }
    
        /// <summary>
        /// Selected Item
        /// </summary>
        public ObjWithDesc SelectedItem
        {
            get
            {
                return (ObjWithDesc)GetValue(SelectedItemProperty);
            }
            set
            {
                SetValue(SelectedItemProperty, value);
            }
        }
    
        public static readonly DependencyProperty SelectedItemProperty =
            DependencyProperty.Register(
                "SelectedItem",
                typeof(ObjWithDesc),
                typeof(HorizontalListBox),
                new PropertyMetadata(OnSelectedItemPropertyChanged)
            );
    
        static void OnSelectedItemPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            ((HorizontalListBox)obj).OnSelectedItemPropertyChanged(e);
        }
    
        private void OnSelectedItemPropertyChanged(DependencyPropertyChangedEventArgs e)
        {
            ObjWithDesc selectedItem = (ObjWithDesc)e.NewValue;
    
            MainListBox.SelectedItem = selectedItem;
        }
    
        private void MainListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.AddedItems.Count > 0)
            {
                SelectedItem = (ObjWithDesc)e.AddedItems[0];
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 2010-10-09
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多