Проблемы привязки свойств зависимостей WP7 - PullRequest
0 голосов
/ 18 октября 2010

У меня есть пользовательский элемент управления, содержащий список.Я хочу привязать свойство списка к выбранному элементу списка, поэтому я создал свойство зависимости.

        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, похоже, не работает.

Редактировать:

Я думаю, что проблема связана сDataContext для UserControl устанавливается на HousePrices (одно свойство в моей виртуальной машине), а SelectedItem устанавливается на другое свойство в моей виртуальной машине.Я предполагаю, что он пытается найти SelectedItem относительно HousePrices.

Еще одна странность заключается в том, что я использую платформу Caliburn Micro.

Есть идеи?

1 Ответ

0 голосов
/ 19 октября 2010

Теперь исправлено.

Я добавил еще одно свойство зависимостей для 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];
        }
    }
...