-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並通知視圖模型屬性?
謝謝。
http://blog.functionalfun.net/2009/02/how-to-databind-to-selecteditems.html – Ramankingdom