2017-08-26 36 views
-1

我有這樣的附加屬性:如果我在同一個窗口中使用兩個控件的附加屬性,這是行不通的

public class ListBoxSelectedItemsAttachedProperty 
    { 
     #region SelectedItems 
     private static ListBox list; 

     public static readonly DependencyProperty SelectedItemsProperty = 
     DependencyProperty.RegisterAttached("SelectedItems", typeof(IList), 
     typeof(ListBoxSelectedItemsAttachedProperty), 
     new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault 
      ,new PropertyChangedCallback(OnSelectedItemsChanged) 
      )); 

     public static IList GetSelectedItems(DependencyObject d) 
     { 
      return (IList)d.GetValue(SelectedItemsProperty); 
     } 

     public static void SetSelectedItems(DependencyObject d, IList value) 
     { 
      d.SetValue(SelectedItemsProperty, value); 
     } 

     private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      ListBox listBox = (ListBox)d; 
      list = listBox; 
      listBox.SelectionChanged += listBox_SelectionChanged; 
      listBox.Unloaded += listBox_Unloaded; 
     } 

     private static void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      IEnumerable listBoxSelectedItems = list.SelectedItems; 
      IList ModelSelectedItems = GetSelectedItems(list); 

      ModelSelectedItems.Clear(); 

      if (list.SelectedItems != null) 
      { 
       foreach (var item in list.SelectedItems) 
        ModelSelectedItems.Add(item); 
      } 
      SetSelectedItems(list, ModelSelectedItems); 
     } 




     private static void listBox_Unloaded(object sender, RoutedEventArgs e) 
     { 
      ListBox listBox = sender as ListBox; 
      listBox.SelectionChanged -= listBox_SelectionChanged; 
      listBox.Unloaded -= listBox_Unloaded; 
     } 
     #endregion 
    } 

而且我有兩個列表框在我的窗口,使用此附加屬性,通過這種方式:

<ListBox HorizontalAlignment="Left" Margin="5,0,5,0" Name="lsbGenerosAsignados" VerticalAlignment="Stretch" Width="Auto" MinWidth="130" Grid.Column="2" Grid.Row="1" 
       SelectionMode="Extended" 
       ItemsSource="{Binding Collection1InViewModel}" 
       DisplayMemberPath="Name" 
       Behaviors:ListBoxSelectedItemsAttachedProperty.SelectedItems="{Binding Property1InViewModel}"> 


    <ListBox HorizontalAlignment="Left" Margin="5,0,5,0" Name="lsbGenerosAsignados" VerticalAlignment="Stretch" Width="Auto" MinWidth="130" Grid.Column="2" Grid.Row="1" 
       SelectionMode="Extended" 
       ItemsSource="{Binding Collection2InViewModel}" 
       DisplayMemberPath="Name" 
       Behaviors:ListBoxSelectedItemsAttachedProperty.SelectedItems="{Binding Property2InViewModel}"> 

但是,當選擇在第一個列表框中改變時,視圖模型不會被通知。如果我從第二個listBox中刪除de附加屬性,那麼它按預期工作。

我怎樣才能使用這個附加屬性與兩個listoBox並通知視圖模型屬性?

謝謝。

+0

http://blog.functionalfun.net/2009/02/how-to-databind-to-selecteditems.html – Ramankingdom

回答

1

這不起作用,因爲你設置全局

private static ListBox list; 

當你擁有2所列出,第二個將覆蓋場名單「,因此它不會工作。試試這個:

public class ListBoxSelectedItemsAttachedProperty 
{ 
    #region SelectedItems 

    public static readonly DependencyProperty SelectedItemsProperty; 

    static ListBoxSelectedItemsAttachedProperty() 
    { 
     FrameworkPropertyMetadata MetaData = new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault 
              , new PropertyChangedCallback(OnSelectedItemsChanged)); 

     SelectedItemsProperty = DependencyProperty.RegisterAttached("SelectedItems", typeof(IList), 
           typeof(ListBoxSelectedItemsAttachedProperty), 
           MetaData); 
    } 

    public static IList GetSelectedItems(DependencyObject d) 
    { 
     return (IList)d.GetValue(SelectedItemsProperty); 
    } 

    public static void SetSelectedItems(DependencyObject d, IList value) 
    { 
     d.SetValue(SelectedItemsProperty, value); 
    } 


    private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ListBox listBox = (ListBox)d; 
     listBox.SelectionChanged += listBox_SelectionChanged; 
     listBox.Unloaded += listBox_Unloaded; 
    } 

    private static void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     var list = (ListBox)sender; 
     IEnumerable listBoxSelectedItems = list.SelectedItems; 
     IList ModelSelectedItems = GetSelectedItems(list); 

     ModelSelectedItems.Clear(); 

     if (list.SelectedItems != null) 
     { 
      foreach (var item in list.SelectedItems) 
       ModelSelectedItems.Add(item); 
     } 
     SetSelectedItems(list, ModelSelectedItems); 
    } 




    private static void listBox_Unloaded(object sender, RoutedEventArgs e) 
    { 
     ListBox listBox = sender as ListBox; 
     listBox.SelectionChanged -= listBox_SelectionChanged; 
     listBox.Unloaded -= listBox_Unloaded; 
    } 
    #endregion 
} 
相關問題