【问题标题】:Why is my namespace not recognized in Visual Studio / xaml为什么我的命名空间在 Visual Studio / xaml 中无法识别
【发布时间】:2011-02-11 23:10:14
【问题描述】:

这些是我的 2 个可附加属性 SelectedItems 类:

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

不起作用,因为 =>

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 { 公共静态类 SelectedItems : DependencyObject { 私有静态只读 DependencyProperty SelectedItemsBehaviorProperty = DependencyProperty.RegisterAttached( "SelectedItemsBehavior", typeof(SelectedItemsBehavior), 类型(列表框), 空);

    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 _listBox; 私有只读 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);           
    }
}

}

【问题讨论】:

  • 听起来像是人为错误,现在提供明确回应的可能性很小。
  • 人为错误在哪里?如果 Visual Studio 允许,我仍然可以更改命名空间...
  • 我确定某处有问题...
  • 你能澄清和清理这个repro,接受答案,还是删除问题?即使花了几分钟试图弄清楚发生了什么,我仍然感到困惑。

标签: c# .net wpf xaml namespaces


【解决方案1】:

起初我认为这是一个错字(也许确实如此),但由于您的异常还显示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

如果这仍然没有帮助,我就离开这里。你的代码真的很乱,至少你是怎么发布的......

【讨论】:

  • 是的,在我在这里打开该线程后不久,我看到了下划线,但这不是原点问题。
猜你喜欢
  • 1970-01-01
  • 2015-02-17
  • 2015-09-17
  • 2015-10-13
  • 1970-01-01
  • 2018-04-08
  • 2020-04-14
  • 1970-01-01
  • 2014-01-21
相关资源
最近更新 更多