2013-07-20 6 views
0

MVVM을 염두에두고 하위 창을 여는 올바른 방법 (예 : 기본 창에서 선택한 항목을 수정)은 무엇입니까? MainWindow.xaml (그리고 MainWindow.xaml.cs를에 자체의 DataContext로 MainVM를 할당) 나는 또한하고 싶은복잡한 객체를 하위 창에 전달

: 여기

내가 가진 무엇 ChildWindow.xaml 및 베어 본 ChildWindow.xaml.cs을 함께 컨트롤 뒤에 ChildVM. 그래서, 지금

:

  1. 어떻게 ChildWindow 팝업과 ChildVM 일부 개체 Data를 전달할 수 있습니다?
  2. 결과 (참/거짓)와 결과 데이터 (일부 복합체 개체)를 MainVM으로 되 찾으십니까?
  3. ChildVM으로 작업하는 동안 Data의 변경 사항이 으로 변경 될 수 있습니까?

다음은 내가 시도한 것입니다. 모든 것을 해결하지는 못했지만 올바른 방향일까요? 용

  • (2), I는 3 DependencyProperties을 갖는다 DialogWindow라는 Window의 서브 클래스 생성 (부울 결과의) (출력 데이터) (입력 데이터) Data, ResultDataResultValue한다.
  • ResultDataResultValue 모두는 Binding을 사용하여 ChildVMDialogWindow으로 설정되고, ResultValue이 설정되면 DialogWindow이 닫힙니다.
  • 지금은 ChildWindow이 MainWindow.xaml.cs에서 시작되었습니다 (모든 의도와 목적으로). 다소 좋지 않습니다. 나는 다음과 같이 몇 가지 입력 데이터를 전달할 수 있습니다

w.Data = myDataObj;

ChildDialogWindow w = new ChildDialogWindow();

그래서, 지금은 ChildVM에 속성 Data이 필요하고, ChildDialogWindow.xaml.cs에서 설정합니다. 다시 말하면 .xaml.cs를 더 두껍게 만듭니다.

MainWindow.xaml.cs를 피하는 더 나은 방법은 MainVM에 의존성으로 전달되는 DialogService 일종일 수 있다고 생각했습니다. 그런데 어떻게 ChildVM에 값을 전달할 수 있습니까?

+1

[어쩌면 이것 좀 봐?] (http://stackoverflow.com/a/16994523/1834662) – Viv

+0

@Viv이는 나쁘지 않다 그것은 프레임 워크를 사용 제외 , 나는 피하기를 바랐다. 아마도 SimpleIoC와 같은 다른 프레임 워크에 의존하지 않는 한 메신저 코드를들 수 있습니다. –

+0

프레임 워크를 사용하지 않는 이유는 무엇입니까? 네이티브 C 코드를 작성하고 피할 수 있습니다. .net all-together :) 당신의 의도가 기능을 "배우는"것이라면, 항상 소스를 얻고 구현 방법을 직접 확인하고 스스로 할 수 있습니다. 'SimpleIoC'는 매우 간단한 DI 컨테이너입니다. 당신이 광범위한 기능을 원한다면 유니티를 살펴보고 정렬 할 수 있습니다. 나는 단지 "의존하지 않기"를 위해서 휠을 다시 발명하는 팬이 아닙니다. – Viv

답변

1

시도해보십시오. DialogService를 만듭니다.

public class DialogService 
{ 
    public void Show(FrameworkElement view, ChildViewModel ChildVM) 
    { 
     Window window = new Window(); 
     window.Content = view; 
     window.DataContext = ChildVM; 

     // For closing this dialog using MVVM 
     ChildVM.RequestClose += delegate 
     { 
      window.Close(); 
     }; 

     window.Show(); 
    } 
} 

CS

지금 ChildVm 클래스에서, 나는 ", RelayCommand"는 ICommand의 도우미를 사용하여 추진하고있어이

public void OpenChildDailog() 
    { 
    DialogService service = new DialogService(); 
    ChildViewModel childVM = new ChildViewModel(); 
    childVM.Data = ; // Assign whatever you want 
    childVM.ResultData = ; 

    service.Show(new ChildView(), childVM); 

    // Now get the values when the child dailog get closed 

    var retVal = childVM.ResultValue; 

} 
+0

감사합니다. ChildView는 UserControl입니까? ChildWindow.xaml/.xaml.cs 있습니다 ...이 UserControl에 찬성이 있습니까? 또한 ... 귀하의 예제에서 service.Show()는 즉시 반환하므로 childVM.ResultValue는 설정되지 않습니다. –

+0

예이 시나리오에서 ChildView는 usercontrol이어야합니다. service.Show()는 즉시 반환하지 않습니다. 사용자가 창을 닫을 때까지 창을 열고 열린 상태를 유지하면'var retVal = childVM.ResultValue; '인 다음 줄로 돌아갑니다. ChildViewModel에서 ResultValue를 설정하는 논리를 제공하여 대화 상자를 닫을 때 반환 될 때 채울 수 있도록하십시오. – UsmanAzam

+1

[Window.Show()] (http://msdn.microsoft.com/en-us/library/system.windows.window.show.aspx) 즉시 반환 ...하지만 적어도 작동해야합니다, ShowDialog()와 함께 ... 감사합니다 –

0

을 시작, 지금은이 방법이

public ICommand CloseCommand 
    { 
     get 
     { 
      if (_closeCommand == null) 
       _closeCommand = new RelayCommand(param => this.OnRequestClose()); 

      return _closeCommand; 
     } 
    } 

    public event EventHandler RequestClose; 

    void OnRequestClose() 
    { 
     EventHandler handler = this.RequestClose; 
     if (handler != null) 
      handler(this, EventArgs.Empty); 
    } 

를 추가 새로운 ViewModel에 IntPtr 데이터 유형 (또는 다른 객체를 사용하십시오.) 많은 쿠키 커터 항목.

홈페이지보기 :

<Button Command="{Binding DataContext.ShowObjectInfoCommand}" CommandParameter="{Binding ObjectOffset}" Content="{Binding Name}"/> 

MainViewModel :

private RelayCommand _showObjectInfoCommand; 
public RelayCommand ShowObjectInfoCommand { get { return _showObjectInfoCommand ?? (_showObjectInfoCommand = new RelayCommand(ExeShowObjectInfoCommand)); } set { } } //Draw Specific Item Table 
void ExeShowObjectInfoCommand(object parameter) 
{ 
    ViewObjectInfo objInfo = new ViewObjectInfo(); 
    IObjectOffsetParameter viewModel = objInfo.DataContext as IObjectOffsetParameter; 
    viewModel.ObjectOffset = (IntPtr)parameter; 
    objInfo.Show(); 
} 

새로운 뷰 모델 + 인터페이스 :

interface IObjectOffsetParameter 
{ 
    IntPtr ObjectOffset { get; set; } 
} 

class ViewModelObjectInfo : ViewModelBase, IObjectOffsetParameter 
{ 
    public ViewModelObjectInfo() 
    { 
    } 

    private IntPtr _objectOffset; //Entity Offset 
    public IntPtr ObjectOffset 
    { 
     get { return _objectOffset; } 
     set { if (_objectOffset != value) { _objectOffset = value; RaisePropertyChanged("Offset"); } } 
    } 
} 

새보기 코드 숨김 :

InitializeComponent(); 
ViewModelObjectInfo viewModel = new ViewModelObjectInfo(); 
this.DataContext = viewModel; 

새보기의 XAML :

<TextBlock Text="{Binding ObjectOffset}"/> 
관련 문제