Почему мое пространство имен не распознается в Visual Studio / xaml - PullRequest
0 голосов
/ 25 апреля 2010

это мои 2 класса a Присоединяемое свойство SelectedItems:

код отсюда: Синхронизация выбранных элементов в списке с несколькими выборками с коллекцией в 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'. Присоединяемое свойство 'Items' не найдено в типе 'SelectedItems

Что я должен изменить?

    using System;

с использованием System.Collections.Generic; использование System.Linq; используя System.Text; использование System.Windows.Controls; использование System.Collections; использование System.Windows;

namespace TBM.Helper { открытый статический класс SelectedItems: DependencyObject { приватная статическая только для чтения DependencyProperty SelectedItemsBehaviorProperty = DependencyProperty.RegisterAttached ( "SelectedItemsBehavior", TypeOf (SelectedItemsBehavior), TypeOf (ListBox), нуль);

    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; using System.Collections;

namespace 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);           
    }
}

}

1 Ответ

1 голос
/ 26 апреля 2010

Сначала я подумал, что это опечатка (и, возможно, так оно и есть), но, поскольку в вашем исключении также указано 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

Если это все равно не поможет, я ухожу отсюда. Ваш код действительно грязный, по крайней мере, как вы его опубликовали ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...