为什么我的命名空间在Visual Studio / xaml中无法识别

时间:2010-04-24 21:10:23

标签: c# .net wpf xaml namespaces

这些是我的2个类可附属物选项:

代码来自此处: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}" ...

不起作用,因为=&gt;

XML命名空间'clr_namespace:TBM.Helper'中不存在属性'SelectedItems.Items'。 在'SelectedItems

类型中找不到可附加属性'Items'

我需要改变什么?

    using System;

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

命名空间TBM.Helper {     public static class SelectedItems:DependencyObject     {         private static readonly 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     {         private readonly ListBox _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);           
    }
}

}

1 个答案:

答案 0 :(得分:1)

起初我认为这是一个拼写错误(也许是错误的),但由于你的例外也用{1}来表示{1}},我认为它实际上可能在你的代码中。尝试用下面的连字符替换下划线:

clr_namespace:TBM.Helper

我没有查看所有其他代码,所以可能还有其他问题。但是,你应该先尝试上面的内容。祝你好运!

编辑:您的xmlns:Helper="clr-namespace:TBM.Helper" 课程与XAML在同一个程序集中吗?否则,您必须引用项目中的其他程序集并将名称空间声明更改为:

SelectedItemsBehavior

此外,您无法为静态类设置基类:

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

这是不可能的。只需删除public static class SelectedItems : DependencyObject

即可

如果这仍然无济于事,我就不在了。你的代码非常混乱,至少你发布它的方式......