2010-04-24 156 views
-2

認識到這些是我的2班可附加屬性SelectedItems:爲什麼我沒有命名空間在Visual Studio中/ XAML

代碼是從這裏:Sync SelectedItems in a muliselect listbox with a collection in ViewModel

的命名空間TBM.Helper可以肯定的是正確的,因爲它的工作原理對於其他類也是如此。

命名空間引用也位於xaml文件和SelectedItems.cs文件中!

xmlns:Helper="clr_namespace:TBM.Helper" 

<ListBox Helper:SelectedItems.Items="{Binding SelectedItems}" ...

不起作用,因爲=>

屬性 'SelectedItems.Items' 不存在XML命名空間存在 'clr_namespace:TBM.Helper'。 類型'SelectedItems

中找不到可附加屬性「Items」。我需要更改哪些內容?

using System; 

using System.Collections.Generic;使用System.Linq的 ; using System.Text; using System.Windows.Controls;使用System.Collections的 ;使用System.Windows的 ;

命名空間TBM.Helper { 公共靜態類SelectedItems:DependencyObject的 { 私人靜態只讀的DependencyProperty SelectedItemsBehaviorProperty = DependencyProperty.RegisterAttached( 「SelectedItemsBehavior」, typeof運算(SelectedItemsBehavior), typeof運算(列表框), 空);

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

    public static void SetItems(ListBox listBox, IList list) { listBox.SetValue(ItemsProperty, list); } 
    public static IList GetItems(ListBox listBox) { return listBox.GetValue(ItemsProperty) as IList; } 

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

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

     return behavior; 
    } 
} 

}

using System.Windows; 

使用System.Windows.Controls;使用System.Collections的 ;

命名空間TBM.Helper { 公共類SelectedItemsBehavior { 私人只讀列表框_listBox; private readonly IList _boundList;

public SelectedItemsBehavior(ListBox listBox, IList boundList) 
    { 
     _boundList = boundList; 
     _listBox = listBox; 

     SetSelectedItems(); 

     _listBox.SelectionChanged += OnSelectionChanged; 
     _listBox.DataContextChanged += OnDataContextChanged; 
    } 

    private void SetSelectedItems() 
    { 
     _listBox.SelectedItems.Clear(); 

     foreach (object item in _boundList) 
     { 
      // References in _boundList might not be the same as in _listBox.Items 
      int i = _listBox.Items.IndexOf(item); 
      if (i >= 0) 
       _listBox.SelectedItems.Add(_listBox.Items[i]); 
     } 
    } 

    private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     SetSelectedItems(); 
    } 

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

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

}

+0

聽起來像人爲錯誤,現在提供清晰響應的可能性非常小。 – nedruod 2010-04-24 23:06:58

+0

人爲錯誤在哪裏?如果Visual Studio允許它,我仍然可以更改名稱空間... – msfanboy 2010-04-25 11:09:51

+0

我確定在那裏有一個問題... – miguel 2010-04-28 21:25:36

回答

0

起初我以爲這是一個錯字(也許是),但因爲你的異常還表示clr_namespace:TBM.Helper用下劃線,我認爲它實際上可能是在你的代碼。嘗試用這樣一個連字符來代替下劃線:

xmlns:Helper="clr-namespace:TBM.Helper" 

我沒有通過其他所有的代碼看,也許還有另外一個問題。但是,你應該嘗試以上第一。祝你好運!

編輯:您的SelectedItemsBehavior類與您的XAML在同一個程序集中嗎?否則,你將不得不引用項目中的其他組件和改變你的命名空間聲明是這樣的:

xmlns:Helper="clr-namespace:TBM.Helper;assembly=MyOtherAssemblyName" 

而且,你不能設置一個靜態類的基類:

public static class SelectedItems : DependencyObject 

這不可能。只要刪除: DependencyObject

如果這仍然沒有幫助,我離開這裏。你的代碼非常混亂,至少你是如何發佈它的......

+0

是的,在我打開這個線程後不久,我看到了下劃線,但那不是原始問題。 – msfanboy 2010-04-29 13:29:37

+0

檢查我的編輯... – gehho 2010-04-30 06:44:22

相關問題