Silverlight 5 - 如何在XAML中使用普通CLR对象作为CommandParameter?

时间:2012-11-06 20:58:42

标签: silverlight xaml parameters command clr

我想知道,如果可能的话,在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}"

就是这样。

1 个答案:

答案 0 :(得分:2)

如果我理解问题,ObjectDataProvider可以帮助找到解决方案。

P.S。如何简单地将对象声明为资源,然后通过StaticResource扩展名使用它。

<Resources>
     <DB:User Id="1" Name="Name" x:Key="User"/>
</Resources>