2010-04-24 157 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

相关问题