2017-08-26 6 views
-1

私はこの添付プロパティがあります。私は、同じウィンドウ内に2つのコントロールで添付プロパティを使用している場合、それは動作しません

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 
    } 

をそして、私はこの添付プロパティを使用して私の窓に2つのリストボックスを、持っています、

<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で選択が変更された場合、ビューモデルは通知されません。 2番目のリストボックスから添付プロパティを削除すると、期待どおりに機能します。

2つのlistoBoxでこの添付プロパティを使用し、ビューモデルのプロパティに通知する方法はありますか。

ありがとうございました。

+0

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

答えて

1

あなたは2つのリストを持っている場合、二番目がそれそう文句を言わない作業を自分フィールド「リスト」を上書きしますグローバル

private static ListBox list; 

を設定しているため、これは動作しません。試してみてください:

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 
} 
関連する問題