2010-10-18 88 views
0

我有一個包含列表框的用戶控件。我想綁定到列表框選定的項目屬性,所以我創建了一個依賴屬性。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]; 
     } 
    } 

我綁定屬性是這樣的:

<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被確定,但以我的虛擬機屬性上的綁定不似乎工作。

編輯:

我認爲這個問題是在DataContext的用戶控件做被設置爲HousePrices(一個屬性在我的VM)和的SelectedItem被設置在我的虛擬機其他屬性。我猜測它試圖找到相對於HousePrices的SelectedItem。

另一個怪癖是我正在使用Caliburn Micro框架。

任何想法?

回答

0

現在已修復。

我爲ItemsSource添加了另一個依賴屬性,並確保將所有DP屬性更改事件連接到用戶控件屬性。

下面是如何使用用戶控件:

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

,這裏是我如何連接起來的DPS:

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