关于C#:为什么在Visual Studio/XAML中无法识别我的命名空间?

Why is my namespace not recognized in Visual Studio / xaml

以下是我的2个类A可附加属性SelectedItems:

代码来自此处:将muliselect列表框中的selecteditems与viewModel中的集合同步

命名空间tbm.helper确实是正确的,因为它也适用于其他类。

命名空间引用也在xaml文件和selecteditems.cs文件中!

1
xmlns:Helper="clr_namespace:TBM.Helper"

但是

不起作用,因为=>

XML命名空间"clr_namespace:tbm.helper"中不存在属性"selecteditems.items"。在类型"SelectedItems"中找不到可附加属性"items"

我要换什么?

1
    using System;

使用system.collections.generic;使用system.linq;使用system.text;使用system.windows.controls;使用system.collections;使用system.windows;

命名空间tbm.helper{公共静态类SelectedItems:DependencyObject{私有静态只读DependencyProperty SelectedItemsBehaviorProperty=DependencyProperty.RegisterAttached("selecteditemsbehavior",typeof(选择editemsbehavior),类型(列表框)零);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    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;
    }
}

}

1
using System.Windows;

使用system.windows.controls;使用system.collections;

命名空间tbm.helper{公共类selecteditemsbehavior{私有只读列表框私有只读列表;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    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);          
    }
}

}


起初我认为这是一个打字错误(也许是),但由于您的例外情况也表示clr_namespace:TBM.Helper带有下划线,我认为它实际上可能在您的代码中。尝试用如下连字符替换下划线:

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

我没有查看所有其他代码,所以可能还有其他问题。但是,您应该首先尝试上述方法。祝你好运!

编辑:您的SelectedItemsBehavior类是否与XAML在同一程序集中?否则,您将不得不引用项目中的另一个程序集,并将命名空间声明更改为如下所示:

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

此外,不能为静态类设置基类:

1
public static class SelectedItems : DependencyObject

这是不可能的。只需拆卸: DependencyObject

如果这仍然不起作用,我就离开这里。你的代码真的很乱,至少你是怎么发布的…