我想知道,如果可能的话,在XAML中使用简单的C#CLR对象作为命令参数,就像我使用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对象有完整的intellisense支持,编译没问题。所以这就像一个魅力。
现在我有一个简单的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并使用该对象,包括像这样的intellisense:
CommandParameter="{db:User ID=1, Name=Foo}
Visual Studio说,我正在使用像MarkupExtension这样的User对象,但它没有。
我完全理解这个问题。普通用户对象不是扩展名。
我没有得到的,是如何使用用户对象作为命令参数,而无需编写自己的扩展。
所以这是我的两个具体问题:
1。)是否可以在XAML中使用我自己的对象,而不将它们包装到扩展中?
2.如果是,那么命令参数的正确语法是什么?
谢谢。
好的,谢谢Dimitri。这是解决方案,因为它现在对我有用:
步骤1)导入命名空间
xmlns:db="clr-namespace:DB"
步骤2)使用CLR对象作为静态资源。
<UserControl.Resources>
<db:User x:Key="User"/>
</UserControl.Resources>
步骤3)将对象密钥(在本例中为User)传递给CommandParameter
CommandParameter="{StaticResource User}
步骤4)将User Object绑定到UserConrol中所需的控件
Text="{Binding Source={StaticResource User}, Path=EMail, Mode=TwoWay}"
就是这样。
答案 0 :(得分:2)
如果我理解问题,ObjectDataProvider可以帮助找到解决方案。
P.S。如何简单地将对象声明为资源,然后通过StaticResource
扩展名使用它。
<Resources>
<DB:User Id="1" Name="Name" x:Key="User"/>
</Resources>