3

約 40 個の属性を持つエンティティに DataForm を使用しています。フォームが 3 つを除くすべての属性を表示する方法に満足しています。これら 3 つの属性はたまたまアイテムのリストです。

編集テンプレート全体をコード化する必要はありません。非常に非生産的なようです。

<dataFormToolkit:DataForm AutoGenerateFields="True" CurrentItem="{Binding XXX, Mode=TwoWay, Source={StaticResource XXXViewModel}}" >
                    <dataFormToolkit:DataField Label="Client"  >
                        <ListBox ItemsSource="{Binding Client}"></ListBox>
                    </dataFormToolkit:DataField>
                </dataFormToolkit:DataForm>
4

3 に答える 3

5

WCF RIAサービスには、OnAutoGeneratingField必要な属性のみのフィールドをオーバーライドおよび変更するCustomDataFormの作成を示すSilverlightビジネスアプリケーションプロジェクトテンプレートが含まれています。アイデアを説明するためにここにコードをコピーしましたが、実際のコードをチェックして、データバインディングを処理するためにReplaceTextBox拡張メソッドをどのように使用しているかを確認することをお勧めします。リンクをダウンロードします。

public class CustomDataForm : DataForm
{
    protected override void OnAutoGeneratingField(DataFormAutoGeneratingFieldEventArgs e)
    {
        // Get metadata about the property being defined
        PropertyInfo propertyInfo = this.CurrentItem.GetType().GetProperty(e.PropertyName);

        // Do the password field replacement if that is the case
        if (e.Field.Content is TextBox && this.IsPasswordProperty(propertyInfo))
        {
            e.Field.ReplaceTextBox(new PasswordBox(), PasswordBox.PasswordProperty);
        }

        // Keep this newly generated field accessible through the Fields property
        this.fields[e.PropertyName] = e.Field;

        // Call base implementation (which will call other event listeners)
        base.OnAutoGeneratingField(e);
    }
}
于 2010-02-04T22:09:04.390 に答える
1

それはうまくいきます:それを試してください

    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
    public class IsPassword : System.Attribute { }

  public class CustomDataForm : DataForm
    {
        protected override void OnAutoGeneratingField(DataFormAutoGeneratingFieldEventArgs e)
        {
            // Get metadata about the property being defined
            PropertyInfo propertyInfo = this.CurrentItem.GetType().GetProperty(e.PropertyName);

            // Do the password field replacement if that is the case
            var attributes = propertyInfo.GetCustomAttributes(typeof(IsPassword), false).ToList();

            if (attributes.Any(obj=>obj is IsPassword))
            {
                PasswordBox box= new PasswordBox();
                Binding binding = new Binding(e.PropertyName);
                binding.Mode = BindingMode.TwoWay;
                box.SetBinding(PasswordBox.PasswordProperty, binding);
                e.Field.Content=box;            
            }
            base.OnAutoGeneratingField(e);
        }
    }

[IsPassword] をプロパティに追加するだけです

于 2011-09-28T15:23:02.100 に答える
-1

私はそれが不可能だと確信しています。私があなただったら、悲しみを飲み込んでその編集テンプレートを作成します.

私が見ることができる唯一の代替手段は、ビューモデルのデータを操作し、変更する必要のない 37 個のプロパティを保持する別のクラスを作成することです。次に、特別な注意が必要な 3 つのエンティティを個別に作成します。このようにして、1 つは自動生成され、もう 1 つはカスタムの 2 つのデータ フォームを持つことができます。うまくいけば、スタイルを設定して、1 つのフォームのように見えるようになります。多くの作業が必要なのはわかっていますが、完全な編集テンプレートを作成するには、さらに多くの作業が必要になる場合があります。

于 2010-01-19T13:28:39.893 に答える