2012-04-13 61 views
2

我是MVVM模型的新手。我有一個按鈕數量的用戶控件。我通過RoutedEvent處理視圖模型類中這些按鈕的click事件。我必須在按鈕的單擊事件中調用/打開另一個用戶控件。如何實現這一目標?如何從Silverlight中的用戶控件的視圖模型類中打開另一個用戶控件?

在此先感謝...

+0

您是否無法訪問捕獲事件的類中的所有用戶控件? – Stainedart 2012-04-13 12:28:44

+0

@CarlT。是的,我可以創建用戶控件的實例。但如何展示他們? – Amit 2012-04-13 12:37:49

回答

0

要麼你把控制與設置爲倒塌,在事件處理程序的visibility屬性的XAML你改變它可見

<TextBlock HorizontalAlignment="Left" Visibility="Collapsed" Name="ErrorBlock" Text="Authentication Failed." VerticalAlignment="Top" Foreground="Red" FontWeight="Bold" /> 

從C#

ErrorBlock.Visibility = System.Windows.Visibility.Visible; 

另一種選擇是以編程方式創建控件並將它們添加到父級,例如網格請參見以下鏈接以添加矩形的示例以網格

http://forums.silverlight.net/t/135977.aspx/1

3

你描述的是問題大多數人剛開始使用MVVM鬥爭一個 - 導航。我試圖避免一般情況下讓我的任何ViewModel都不承擔任何自己的觀點(視圖模型應該是非常不可見的視圖)或任何其他視圖的任何知識。

解決此問題的一種方法是在應用程序中有一個處理所有導航的中心組件。我們稱之爲NavigationController。該組件負責處理導航請求,並負責創建視圖(以及可選的相關視圖模型)及其初始化,並且它是應用程序中真正瞭解各種視圖模型及其各自視圖之間相互依賴關係的唯一組件。

理想情況下,ViewModel和控制器之間的通信是通過事件聚合器(例如TinyMessenger)執行的,這使得實現鬆耦合導航(以及更多)變得容易。

作爲最後一句話,我懷疑你的意思是你想調出一個簡單的UserControl,而不是某種類型的對話,這意味着一個UserControl託管在子窗口中。這可以使用我列出的方法來解決。

0

要做你想做的事情,你需要使用控件和窗體的組合。請注意,我的答案適用於Silverlight 4及更高版本。 首先,我將按鈕「命令」綁定到視圖模型命令實現。在下面的例子中,我的控件的DataContext是我的視圖模型的一個實例。我的ViewModel實現了一組Keys(字符串)和ViewModelCommand類的散列表。忽略實現的複雜性。點是按鈕是有界的一個「COMMAND」

<Button Style="{StaticResource stTitleButton}" Height="Auto" Foreground="White" 
        Command="{Binding ViewModelCommandIoC.ViewModelCommands[FIND]}" 
        CommandParameter="{Binding ElementName=enHiddenControl}" 
        Visibility="{Binding CanSwitchCustomer,Converter={StaticResource VisibilityValueConverter},FallbackValue=Collapsed}" 
        > 

在上面的例子中,該命令被綁定到我的指揮下「FIND」索引。這與直接綁定到命令是一樣的。下一個重要部分是CommandParameter。這是您希望在新窗口中顯示的控件的隱藏實例。在這種情況下控件的名稱是'enHiddenControl'。您可以將此控件放置在屏幕的任何位置,只要確保其隱藏即可。這將作爲命令方法簽名中的參數。例如:

/// <summary> 
    /// Finding an existing customer 
    /// </summary> 
    /// <param name="sender">The command parameter - control </param> 
    /// <param name="e"></param> 
    public void OnChangeCustomer(object sender)... 

當此發件人進來,我們的目標是獲得類型,並使用激活創建類的實例。活化劑可在System.ReflectionSystem.Reflection.Emit中找到。一旦你創建這個類的一個實例

Activator.CreateInstance(sender.GetType()) 

,將其添加到LayoutGrid一個「ChildControl」(我是從我的頭頂打字時,它的主要理論,但應該工作)。怎麼樣?創建一個網格,將其命名爲「LayoutRoot」。創建一個ChildControl,將網格添加到子控件,然後將剛創建的實例添加到網格。顯示錶單。從理論上講,您只是在不知道特定類的情況下動態創建帶有控件的表單。只有泛型。形式的大小......這是另一回事。我會使用自動的寬度和高度。因此,控制的大小應該在理論上決定了表單的大小。

在結束的方法應該是這個樣子:

public void OnChangeCustomer(object sender) 
{ 
     //the search screen 
     if (sender is UserControl) 
     { 
      UserControl uc = Activator.CreateInstance(sender.GetType()) as UserControl; 
      Grid grdLayoutRoot = new Grid(); 
      grdLayoutRoot.Name = "LayoutRoot"; 
      grdLayoutRoot.Children.Add(uc); 
      ChildWindow cw = new ChildWindow(); 
      cw.Content = grdLayoutRoot; 
      cw.Show(); 
     } 
} 

所有這一切都是理論和從未被測試,但它應該工作,給我拉的這些絕技的時間量在C#中的一種自然。

相關問題