2

可能であれば、MarkupExtensions で行うように、XAML で単純な C# CLR オブジェクトをコマンド パラメーターとして使用する方法を知りたいです。

たとえば、次のような独自のマークアップ拡張機能を使用します。

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 の完全な 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 オブジェクトを使用していますが、それはありません。

私は問題を完全に理解しています。プレーンなユーザー オブジェクトは拡張機能ではありません。

私が得られないのは、独自の拡張機能を作成せずに、ユーザー オブジェクトをコマンド パラメーターとして使用する方法です。

だからここに私の2つの具体的な質問があります:

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が解決策を見つけるのに役立ちます。

StaticResourcepsオブジェクトをリソースとして単純に宣言し、拡張機能を介して使用するのはどうですか。

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