2013-09-01 4 views
12

GUI를 사용하여 SQL 쿼리를 생성하는 도구를 작성했습니다. MVVM 및 WPF를 사용하여 도구를 다시 작성하려고합니다. 모든 SQL 열 유형은 다음 이미지에서 볼 수있는 것과 다른 컨트롤을 가지고 있습니다.MVVM 및 컨트롤의 동적 생성

enter image description here

난은 SQL 컬럼 유형에 따라 열 필터 제어부를 추가하고 난 창 형태로 수행하는 데 사용되는 것처럼, 코드를 이용하여 제어를 생성한다.

  1. 은 MVVM에서 나는, 뷰가 XAML을 사용하여 enteirly writtien 것을 읽었습니다 내가 스택 패널에 동적으로 다른 사용자 컨트롤을 추가 할 필요가 MVVM 스위트와 같은 응용 프로그램이 무엇입니까?
  2. 일부 열을 두 번 클릭하지 않으면 컨트롤이보기에 존재하지 않으므로 컨트롤이 xaml에서 사용할 수 없으며 숨겨 지거나 접히지 않습니다.
  3. 거기있는 코드에서 바인딩을 피할 수있는 방법은 무엇입니까?
  4. 각 열 유형에 대해 사용자 정의 컨트롤을 만들어야합니까?
  5. 일반적으로 mvvm을 사용하여 복잡하고 동적 인 ui와 같은 응용 프로그램을 devlop에 연결하는 가장 좋은 방법은 무엇입니까?
+4

XAML은 MVVM이 아닙니다. 그리고 WPF! = MVVM. WPF는 MVVM의 좋은 친구이며 XAML은 UI 마크 업입니다. XAML-view는 XAML 만 아니며 클래스 (코드 비하인드)를 붙 였지만 주 논리로 사용하면 안되므로 가능한 한 적게 사용하십시오. 물론 코드 숨김으로 컨트롤 생성을 구현할 수도 있지만 이는 ** 절대적으로 MVVM ** 접근 방식이 아닙니다. – oxfn

+3

@ user1590636 생성 된 GUI가 정말 멋지고 단순 해 보입니다. – WiiMaxx

+2

여자 친구와 결혼하게하셨습니까? – Purusartha

답변

13

짐작 나는 그것을 달성하는 방법을 알고 있지만 매우 복잡한 것입니다. 먼저 MVVM 기본 개념을 이해해야합니다. 기본 ViewModel은 ObservableCollection의 ViewModels 클래스 여야하며 각 뷰는 해당 데이터와 속성이있는 열을 나타냅니다. 보기에서

interface IViewModel : INotifyPropertyChanged,IDisposable 
{ 
} 

interface IColumnViewModel : IViewModel 
{ 
} 

class ViewModelBase : IViewModel 
{ 
    // ... MVVM basics, PropertyChanged etc. ... 
} 

class MainViewModel : ViewModelBase 
{ 
    ObservableCollection<IColumnViewModel> Columns {get; set} 
} 

나는 자동으로 목록 항목의 바인더 제본 DataContext에 따라 WPF에 의해 선택되어야한다 DataTemplateContentControl을 포함한다 ItemTemplateItemsControl 같은 것을, 가정합니다.StackPanel 자체는 적합하지 않습니다,하지만 그래서, 당신은 모든 열 유형에 대한보기/뷰 모델 쌍을 구축해야 ItemsPanelTemplate

<Window 
    xmlns:v="clr-namespace:WpfApplication.Views" 
    xmlns:vm="clr-namespace:WpfApplication.ViewModels"> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type TypeName=vm:TextColumnViewModel}"> 
      <v:TextColumnView/> 
     </DataTemplate> 
    </Window.Resources> 
    <ItemsControl 
     ItemsSource="{Binding Columns}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <ContentControl Content="{Binding}"/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Window> 

로 호출 할 수 있습니다.

희망, 제 예제가 도움이 될 것입니다. 여자 친구와 MVVM에 행운을 빕니다.

1

글쎄,보기가 완전히 XAML로 작성된 것은 아니며 C#에서 컨트롤을 생성합니다.

저는 이것을 다시 작성하고 MVVM 몰드에 맞추는 것으로부터 뭔가를 얻을 것이라고 생각하지 않습니다. 코드를 그대로 유지하고 즐기십시오. 내가 제대로 시나리오를 이해 한 경우

+6

문제는 MVVM을 사용하지 않는다면 제 여자 친구가 저와 결혼하지 않을 것입니다. MVVM을 사용하는 것과 같은 것을 쓰고 싶다면 어떻게 할 것인가에 대한 일반적인 아이디어를 줄 수 있습니까? – user1590636

+1

코드에서 바인딩을 생성해야합니다. – zmbq

+1

@zmbq 그는 코드에서 바인딩을 생성 할 필요가 없다. 단지 일반적인 방법으로 그의 물건을 표시 할 수 있어야하는 DataTemplates의 구멍 뭉치를 사용해야한다. – WiiMaxx

3

: 당신은 데이터 템플릿 & 항목을 사용할 수 있습니다 나는 다음 컬렉션에 데이터를로드하는 응용 프로그램을 작성했습니다 예를 들어 템플릿은 랩 패널에서 해당 모음의 각 항목을 보여줍니다 [또는 스택 패널]에 정의 된 데이터 템플릿을 기반으로합니다. 그리고 랩 penel 항목은 두 가지 방법으로 당신은 그런 다음 컬렉션을 채우고 난이

3

도움이되기를 바랍니다 뷰 에 결과를 볼 수있는이 목표 를 달성하기 위해 관찰 가능한 컬렉션을 사용하는 것이 좋습니다 바인딩 내 컬렉션 그 자체로 동기화되어 MVVM에서 이와 같은 것을 작성하려면 내용 영역과 같은 하나의 뷰가 있어야합니다. 뷰에는 뷰 모델이 있고 뷰 모델의 속성 중 하나는 뷰가되거나 해당 뷰 모델의 여러 속성이 뷰가됩니다. 때때로 머리를 감싸는 데 약간의 시간이 걸리지 만 Inversion of Control 및 Dependency Injection을 적절하게 사용하면 MVVM 패턴에서보기 뷰를 매우 쉽게 관리 할 수 ​​있습니다.