2017-06-08 44 views
1

在我的MainWindow VM中,我從我的UserControls打開這樣的視圖。 Usercontrol1是在Xaml中製作的視圖的名稱。 在我的我的主窗口的視圖模型:從用戶控件訪問父窗口的網格

private static Grid _myMainGrid; 

    public static Grid MyMainGrid 
    { 
     get { return _myMainGrid; } 
     set { _myMainGrid = value; } 
    } 

    private void OpenUserControl(UserControl myUS) 
    { 
     if (MyMainGrid.Children.Count > 0) 
     { 
      MyMainGrid.Children.RemoveAt(0); 
     } 
     Grid.SetColumn(myUS, 1); 
     Grid.SetRow(myUS, 0); 
     MyMainGrid.Children.Add(myUS); 
    } 
    private void FindGrid(object obj) 
    { 
     var myGrd = obj as Grid; 
     if (myGrd != null) 
     { 
      MyMainGrid = myGrd; 
     } 
    } 

的命令綁定到按鈕執行此操作。

private void ExecuteCMD_OpenUserControl1(object obj) 
    { 
     FindGrid(obj); 
     Usercontrol1 _ucItem = new Usercontrol1(); 
     OpenUserControl(_ucItem); 
    } 

現在我想開Usercontrol2從我的主窗口更換的UserControl1在MyMainGrid通過的UserControl1按下按鈕。所以我必須訪問父窗口。

嘗試使用this methode,但不能得到它在我的情況下工作。

+1

您不希望或需要用戶控件對其父項執行任何操作。不是一個好主意。這裏真正的目標是什麼?你應該在任何情況下使用MVVM/XAML,而不是在代碼隱藏中創建控件。 –

+0

我已經在MVVM/Xaml中創建了用戶控件。我在UsercontrolOrderOversight中有一個datagrid,我想在他的UsercontrolOrder中打開特定的順序,但是我希望它能打開它並替換監督 –

+0

那麼他們是否有viewmodels?我不知道「打開它並取代監督」是什麼意思。你應該使用MVVM來完成你的整個應用程序,不僅僅是幾個小角落,其餘的都是winform。 –

回答

1

假設你有兩個孩子;將其推廣到任何數量的孩子是微不足道的。幸運的是,您已經有了視圖模型和視圖,所以我們就是這方面的大部分。這只是一個與WPF配合得很好的方式。

這是一組骨骼視圖模型。主要和兩個孩子。 MainViewModel創建它的兩個子實例。 ChildOneViewModel有一個Next按鈕命令,綁定到ChildOneView.xaml中的Button

當用戶單擊該按鈕時,我們想要將活動視圖切換到子視圖2。 ChildOneViewModel不是對所有方向都有依賴性,而是對「下一步」的真正含義一無所知;其母公司MainViewModel負責該項工作。每個人都知道他的孩子;你發現在編程中,讓一個班級瞭解其兄弟姐妹或其父母會產生問題。

因此,所有ChildOneViewModel確實是暴露一個事件,所以MainViewModel知道按鈕被點擊時,並可以採取任何行動,當它發生。這很酷,因爲如果我們可以轉到兩個不同的「下一個」頁面中的一個,取決於用戶在ChildOne中做了什麼?如果我們將這一責任轉移給家長,一切都變得更簡單。易於編寫,更容易在不同的上下文中重用。

#region MainViewModel Class 
public class MainViewModel : ViewModelBase 
{ 
    public MainViewModel() 
    { 
     ChildOne = new ChildOneViewModel(); 
     ChildTwo = new ChildTwoViewModel(); 

     ActiveChild = ChildOne; 

     ChildOne.NextButtonClicked += (s, e) => ActiveChild = ChildTwo; 
    } 

    #region ActiveChild Property 
    private INotifyPropertyChanged _activeChild = default(INotifyPropertyChanged); 
    public INotifyPropertyChanged ActiveChild 
    { 
     get { return _activeChild; } 
     set 
     { 
      if (value != _activeChild) 
      { 
       _activeChild = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 
    #endregion ActiveChild Property 

    public ChildOneViewModel ChildOne { get; private set; } 
    public ChildTwoViewModel ChildTwo { get; private set; } 
} 
#endregion MainViewModel Class 

#region ChildOneViewModel Class 
public class ChildOneViewModel : ViewModelBase 
{ 
    public event EventHandler NextButtonClicked; 

    // You already know how to implement a command, so I'll skip that. 
    protected void NextButtonCommandMethod() 
    { 
     NextButtonClicked?.Invoke(this, EventArgs.Empty); 
    } 
} 
#endregion ChildOneViewModel Class 

#region ChildTwoViewModel Class 
public class ChildTwoViewModel : ViewModelBase 
{ 
} 
#endregion ChildTwoViewModel Class 

及這裏的翻譯了這一切爲實際的用戶界面在運行時的XAML:你不需要OpenUserControl()FindGrid(),任何東西

<Window.Resources> 
    <!-- 
    These are "implicit datatemplates": They have no x:Key, so they'll be 
    automatically used to display any content of the specified types. 
    --> 
    <DataTemplate DataType="{x:Type local:ChildOneViewModel}"> 
     <local:ChildOneView /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type local:ChildTwoViewModel}"> 
     <local:ChildTwoView /> 
    </DataTemplate> 
</Window.Resources> 
<Grid> 

    <!-- other stuff --> 
    <UserControl 
     Content="{Binding ActiveChild}" 
     /> 
    <!-- other stuff --> 

-1

我不完全理解你的應用程序的結構,最有可能有更好的方法來做任何你想做的事情,但你可以使用Application.Current.Windows屬性在應用程序中的任何打開的窗口的引用,如果這是您的主要問題:

var mainWindow = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault(); 

裏面一個加載UserControl,你也應該能夠得到這個UserControl這樣的父窗口的引用:

var mainWindow = Window.GetWindow(this) as MainWindow; 
+0

我是一名學生,所以我知道可能有更好的方法;)但它爲我需要它做的工作。今晚會嘗試這個,並提供反饋。 –

相關問題