2013-01-23 18 views
5

註冊我有這樣的代碼:物業已經通過 'ListView控件'

using System.Collections; 
using System.Windows; 
using System.Windows.Controls; 

public static class SelectedItems 
{ 
    private static readonly DependencyProperty SelectedItemsBehaviorProperty = DependencyProperty.RegisterAttached(
     "SelectedItemsBehavior", 
     typeof(SelectedItemsBehavior), 
     typeof(ListView), 
     null); 

    public static readonly DependencyProperty ItemsProperty = DependencyProperty.RegisterAttached(
     "Items", 
     typeof(IList), 
     typeof(SelectedItems), 
     new PropertyMetadata(null, ItemsPropertyChanged)); 

    public static void SetItems(ListView listView, IList list) 
    { 
     listView.SetValue(ItemsProperty, list); 
    } 

    public static IList GetItems(ListView listView) 
    { 
     return listView.GetValue(ItemsProperty) as IList; 
    } 

    private static void ItemsPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var target = d as ListView; 
     if (target != null) 
     { 
      CreateBehavior(target, e.NewValue as IList); 
     } 
    } 

    private static void CreateBehavior(ListView target, IList list) 
    { 
     var behavior = target.GetValue(SelectedItemsBehaviorProperty) as SelectedItemsBehavior; 
     if (behavior == null) 
     { 
      behavior = new SelectedItemsBehavior(target, list); 
      target.SetValue(SelectedItemsBehaviorProperty, behavior); 
     } 
    } 
} 

public class SelectedItemsBehavior 
{ 
    private readonly ListView _listView; 
    private readonly IList _boundList; 

    public SelectedItemsBehavior(ListView listView, IList boundList) 
    { 
     _boundList = boundList; 
     _listView = listView; 
     _listView.SelectionChanged += OnSelectionChanged; 
    } 

    private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     _boundList.Clear(); 

     foreach (var item in _listView.SelectedItems) 
     { 
      _boundList.Add(item); 
     } 
    } 
} 

XAML:

<ListView SelectionMode="Extended" ItemsSource="{Binding Computers}" Views:SelectedItems.Items="{Binding SelectedComputers}" BorderBrush="Transparent" Height="100" VerticalAlignment="Top"> 
     <ListView.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top" /> 
      </ItemsPanelTemplate> 
     </ListView.ItemsPanel> 
     <ListView.Background> 
      <SolidColorBrush Color="Black" /> 
     </ListView.Background> 
    </ListView> 

我已經得到的

'SelectedItemsBehaviour' 屬性已經是一個錯誤通過 'Listview'註冊。

我在兩個單獨的ListViews這兩個地方使用了這段代碼,並且都出現這個錯誤。

爲什麼我得到它,一切都是靜態的。我正在使用MVVM設計模式。

感謝,

+0

我也有組合框行爲相同的問題。 [我在我的博客中提到了修復](http://contractnamespace.blogspot.com/2014/04/default-text-on-wpf-combo-boxes.html),以防其他人遇到相同情況錯誤。 –

回答

12

RegisterAttachedownerType)的第三個參數必須始終聲明的屬性,它是SelectedItems這裏的類。

這是一種常見的誤解,這種類型是屬性的潛在「目標」類型。

private static readonly DependencyProperty SelectedItemsBehaviorProperty = DependencyProperty.RegisterAttached(
    "SelectedItemsBehavior", 
    typeof(SelectedItemsBehavior), 
    typeof(SelectedItems), // here 
    null); 
+0

非常好,謝謝 –