所以我很确定在定义部分,我需要包括一些东西:
xmlns:s="clr-namespace:System.Collections.Generic;assembly=?????"
但我就是不知道该用什么来代替??
我想对代码做的是:
<UserControl.DataContext>
<ObjectDataProvider
MethodName="CreateNodes"
ObjectType="{x:Type local:TreeViewModel}" >
<ObjectDataProvider.MethodParameters>
<s:List<T>>
{Binding Nodes}
</s:List<T>>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</UserControl.DataContext>
所以当我做objectDataProvider调用时,我可以将列表传递给它正在调用的方法(CreateNodes)…
我该怎么做呢?
谢谢!
编辑-可能是一个修复?
我只是把这个放在方法中,而不是在列表中传递,它只是一个应用程序变量…我不知道应用程序变量是不是不好
List<TNode> existingNodes;
if (Application.Current.Properties.Contains("ExistingNodes")) existingNodes = Application.Current.Properties["ExistingNodes"] as List<TNode>;
else existingNodes = new List<TNode>();
XML名称空间声明的assembly
部分将是mscorlib
。
但是无论如何,XAML不支持泛型(*),所以你不能这样做。相反,您可以创建一个继承List<T>
的类,并在XAML中使用它:
class ListOfFoo : List<Foo>
{
}
(1)实际上泛型在XAML 2009中是支持的,但是大多数XAML 2009在编译后的XAML中是不支持的。
在我的情况下,这是可以的。如果您像这样定义List属性:
internal static readonly BindableProperty TestListProperty = BindableProperty.Create("TestList", typeof(List<string>), typeof(View), null, propertyChanged: (bindable, oldValue, newValue) =>
{
var view = (View)bindable;
List<string> v = (List<string>)newValue;
view.testList = v;
},
defaultValueCreator: (bindable) =>
{
var view = (View)bindable;
return view.testList;
});
private List<string> testList;
public List<string> TestList
{
get
{
return (List<string>)GetValue(TestListProperty);
}
set
{
SetValue(TestListProperty, value);
}
}
然后在XAML:
中使用xmlns:s="clr-namespace:System.Collections.Generic;assembly=netstandard"
...
<View>
<View.TestList>
<s:List x:TypeArguments="x:String" >
<x:String>abc</x:String>
<x:String>123</x:String>
<x:String>456</x:String>
</s:List>
</View.TestList>
</View>
...