2013-01-23 6 views
5

Ich habe diesen Code:Habe schon von 'Listview' registriert

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> 

Ich habe einen Fehler von

bekam

'SelectedItemsBehaviour' Eigenschaft war bereits registriert von 'Listview'.

Ich habe diesen Code an zwei Stellen auf zwei separate ListViews verwendet und beide geben diesen Fehler.

Warum bekomme ich es, alles ist statisch. Ich verwende das MVVM-Entwurfsmuster.

Danke,

+0

Ich hatte auch das gleiche Problem mit einem Kombinationsfeld Verhalten. [Ich habe das Update in meinem Blog erwähnt] (http://contractnamespace.blogspot.com/2014/04/default-text-on-wpf-combo-boxes.html), nur für den Fall, dass jemand anderes auf dasselbe stößt Error. –

Antwort

12

Der dritte Parameter zu RegisterAttached (ownerType) muss immer die Klasse sein, die die Eigenschaft erklärt, die SelectedItems hier.

Es ist ein häufiges Missverständnis, dass dieser Typ ein potenzieller "Ziel" -Typ der Eigenschaft ist.

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

Ausgezeichnet, danke –

Verwandte Themen