【发布时间】: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