2010-01-10 2 views
3

약 40 개의 속성이있는 엔티티에 대해 DataForm을 사용하고 있습니다. 3 가지를 제외하고 양식이 표시되는 방식에 만족합니다. 이 세 가지 속성은 항목 목록입니다.전체 편집 템플릿을 만들지 않고도 Silverlight DataForm에 DataField를 추가 할 수 있습니까?

전체 편집 템플릿을 코드화하고 싶지는 않지만 매우 생산적인 것으로 보입니다.

<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> 

답변

5

WCF RIA Services에는 Silverlight 비즈니스 응용 프로그램 프로젝트 템플릿이 포함되어 있으며 사용자 지정 데이터 폼이 OnAutoGeneratingField을 덮어 쓰고 원하는 특성 만 수정할 수있는 CustomDataForm을 만드는 방법을 보여줍니다. 아이디어를 설명하기 위해 여기에 코드를 복사했지만, ReplaceTextBox 확장 메서드를 사용하여 데이터 바인딩을 처리하는 방법을 확인하려면 실제 코드를 확인하는 것이 좋습니다. Download link.

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); 
    } 
} 
-1

나는 그것이 가능하지 않을 것이라고 확신합니다. 내가 너라면 나는 슬픔을 삼켜 그 편집 틀을 만들거야.

내가 볼 수있는 유일한 대안은 viewmodel의 데이터로 작업하고 변경하지 않아도되는 37 개의 속성을 보유하는 별도의 클래스를 만드는 것입니다. 그런 다음 특별한주의가 필요한 3을위한 별도의 엔티티를 만듭니다. 이렇게하면 자동 생성 된 데이터 양식과 사용자 정의 된 데이터 양식 두 가지를 가질 수 있습니다. 다행히도 스타일을 지정하여 작업 할 수 있기 때문에 한 가지 형태처럼 보입니다. 많은 작업이 있지만 전체 편집 템플릿을 만드는 것이 더 많은 작업 일 수 있습니다.

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] 당신의 재산에

관련 문제