2011-02-19 4 views
0

DB 마이그레이션을위한 응용 프로그램을 만들고 있습니다. WPF GUI로 멀티 스레드 프레임 워크를 만들었습니다. 나는 나의 공간/폴더에이 같은가 someting를 넣어 :WPF "부분 형식"

class Something : Migrator { 
    public override Run(){ 
     //I would need this 
     string valueOfMyCustomFieldOnForm = xyz.Text; //example 

     int count = 500; 
     for(int i = 0; i < 500; i++){ 
      //do something here 
      OnProgressChanged(...); //call event, GUI is updated 
     } 
     OnCompleted(...); //migration completed 
    } 
} 

그런 반성은 내가 드롭 다운 목록에 그 이름 공간에있는 모든 클래스를 넣어. 목록에서 하나를 선택하고 시작을 클릭하면 Run 메서드의 코드가있는 스레드가 시작됩니다.

DB Host: TEXTBOX 
DB Username: TEXTBOX 
DB Password: TEXTBOX 
-- 
Migrator custom field 1: TEXTBOX 
Migrator custom field 2: TEXTBOX 
... 
-- 
List with migrated items - irrelevant 

(데이터베이스 호스트, 사용자 이름 등 ...) GUI에는 몇 가지 commong 필드가 있습니다. 그러나 일부 이주자에게는 GUI에서 사용자 정의 필드가 필요합니다 (예 : 3 개의 추가 텍스트 필드). WPF에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 동적 인 GUI의 일부가 필요합니다.

답변

2

내 생각 엔 WPF에서 메타 데이터 기반 UI를 만드는 메커니즘에 관한 겉으로는 무의미한 정보가 많이 있습니다. 이 문제에 접근하는 방법은 다음과 같습니다.

속성 시트와 같은 UI를 작성한다고 가정합니다. 프롬프트 및 입력 제어와 함께 각 속성에 대한 행을 표시하는 격자입니다. 이렇게하려면 컬렉션의 각 항목에 속성 및 값을 설명하는 속성이 포함 된 개체 컬렉션이 필요합니다. 간단한 디자인은 Prompt 속성과 Value 속성을 노출하고 변경 알림을 구현하는 클래스입니다.

당신이 만든이 컬렉션을 채운 후에는 그리드에 그것을 표시하는 ItemsControl 구현할 수 있습니다

<ItemsControl ItemsSource="{Binding Properties}" Grid.IsSharedSizeScope="True"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate DataType="PropertyViewModel"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition SharedSizeGroup="Prompt"/> 
       <ColumnDefinition SharedSizeGroup="Value"/>     
      </Grid.ColumnDefinition> 
      <Grid.RowDefinitions> 
       <RowDefinition/> 
      </Grid.RowDefinitions> 
     </Grid> 
     <Label Content="{Binding Prompt}"/> 
     <TextBox Grid.Column="1" Text="{Binding Value, Mode=TwoWay}"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

이 매우 간단합니다 - 그것에 대해 가장 복잡한 것은의 Grid.IsSharedSizeScope 그래서 모두 사용됩니다 이 컨트롤이 만드는 그리드는 동일한 열 너비를 사용합니다. ItemsControl 대신 ListView을 사용할 수도 있지만이 경우 ListView을 사용하면 다루지 않을 수있는 포커스 및 선택과 관련된 문제가 많이 발생합니다. 진정한 속성 시트가하는 것처럼 - 때문에 WPF 템플릿 매칭되는 마법, 당신이 생각할 수 objectValue 속성을 구현 수 있고, Value 속성의 다른 가능한 유형을 처리 할 수있는 다양한 템플릿을 만드는 것이

참고. 이렇게하려면 각 유형에 대한 템플릿을 만들 것, 예를 들면 :

<DataTemplate DataType="{x:Type System:String}"> 
    <TextBox Text="{Binding Value, Mode=TwoWay}"/> 
</DataTemplate> 
<DataTemplate DataType="{x:Type System:DateTime}"> 
    <DatePicker Value="{Binding Value, Mode=TwoWay}"/> 
</DataTemplate> 

등 그럼 당신은 그래서 대신 TextBoxValue을 보여주는의 PropertyViewModel의 템플릿을 변경 것, 그것은 ContentPresenter를 사용 예 :

<ContentPresenter Grid.Column="1" Content="{Binding}"/> 
관련 문제