我想知道,如果可能的话,使用简单的 C# CLR 对象作为 XAML 中的命令参数,就像我使用 MarkupExtensions 一样。
例如,我使用自己的标记扩展,如下所示:
public class FormOpenExtension : MarkupExtension
{
public eForm e { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
XAML 中 MarkupExtension 的使用如下所示:
CommandParameter="{gui:FormOpen e=Login}
在 XAML 中,我对 FormOpenExtension Object 有完整的智能支持,编译没问题。所以这就像一个魅力。
--------------------------------------
现在我有一个简单的 CLR 对象,例如,它看起来像这样:
namespace DB
{
[DataContract(IsReference = true)]
public partial class User
{
#region Primitive Properties
[Key][DataMember]
public virtual int ID
{
get;
set;
}
[DataMember]
public virtual string Name
{
get;
set;
}
}
}
我可以将命名空间导入 XAML 并使用该对象,包括这样的智能感知:
CommandParameter="{db:User ID=1, Name=Foo}
Visual Studio 说,我正在使用像 MarkupExtension 这样的用户对象,但它没有。
我完全理解这个问题。普通用户对象没有扩展。
我不明白的是如何将用户对象用作命令参数,而无需编写我自己的扩展。
所以这是我的两个具体问题:
1.) 是否可以在 XAML 中使用我自己的对象,而不将它们包装到扩展中?
2.) 如果是,命令参数的正确语法是什么?
谢谢你。
----------------------------------
好的,谢谢迪米特里。这是解决方案,因为它现在对我有用:
步骤 1) 导入命名空间
xmlns:db="clr-namespace:DB"
步骤 2) 使用 CLR 对象作为静态资源。
<UserControl.Resources>
<db:User x:Key="User"/>
</UserControl.Resources>
步骤 3) 将对象键(在本例中为用户)传递给 CommandParameter
CommandParameter="{StaticResource User}
步骤 4) 将用户对象绑定到您的 UserConrol 中的所需控件
Text="{Binding Source={StaticResource User}, Path=EMail, Mode=TwoWay}"
就是这样。