2010-10-18 7 views
0

J'ai un contrôle utilisateur contenant une zone de liste. Je veux lier à la propriété d'élément sélectionné listboxes afin que j'ai créé une propriété de dépendance.Problèmes de liaison de propriété de dépendance WP7

 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]; 
     } 
    } 

Je lie à la propriété comme ceci:

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

Mon point de vue propriétés du modèle:

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

Je peux voir le dp étant fixé, mais la liaison à ma propriété vm ne le fait pas semble fonctionner.

Edit:

Je pense que le problème est de faire avec le DataContext pour le UserControl étant mis à HousePrices (une propriété dans ma VM) et SelectedItem étant réglé sur une autre propriété dans ma machine virtuelle. Je devine qu'il essaye de trouver SelectedItem par rapport à HousePrices.

Une autre bizarrerie est que j'utilise le cadre Caliburn Micro.

Des idées?

Répondre

0

Corrigé maintenant.

J'ai ajouté une autre propriété de dépendance pour ItemsSource et vérifié que tous les événements de la propriété DP ont été câblés aux propriétés du contrôle utilisateur.

Voici comment le contrôle de l'utilisateur a été utilisé:

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

et voici comment je câblé PDD:

/// <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]; 
     } 
    } 
Questions connexes