2

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

就是这样。

4

1 回答 1

2

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

ps 简单地将对象声明为资源然后通过StaticResource扩展使用它呢?

<Resources>
     <DB:User Id="1" Name="Name" x:Key="User"/>
</Resources>
于 2012-11-06T21:11:39.640 回答