2011-06-07 32 views
1

最後,我決定跳到WPF大潮,決定遵循MVVM模式創建我的應用程序。我也使用Caliburn.Micro。在第二個窗口上綁定數據項

我發現了許多綁定數據到Windows的例子,但所有的例子只包含一個MainWindow。我無法弄清楚如何在打開第二個和第三個窗口時引用並進行綁定。爲了說明我的問題,我創建了一個簡單的應用該應用程序有兩個窗口,主窗口名爲ShellView,第二個窗口名爲Window1View。我在這個應用程序中需要的是將myStr1的內容顯示在Window1View的TextBox中。

下面是代碼:

Views.ShellView.xaml

<Window x:Class="Test.Views.ShellView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TextBlock x:Name="Title" /> 
     <Button Content="Window 1" Height="31" HorizontalAlignment="Left" Margin="24,268,0,0" Name="btnWin1" VerticalAlignment="Top" Width="87" Click="btnWin1_click" /> 
    </Grid> 
</Window> 

Views.ShellView.xaml.cs

namespace Test.Views 
{ 
    using System.Windows; 

    public partial class ShellView : Window 
    { 
     public ShellView() 
     { 
      InitializeComponent(); 
     } 

     private void btnWin1_click(object sender, RoutedEventArgs e) 
     { 
      Window1View win1 = new Window1View(); 
      win1.Show(); 
     } 
    } 
} 

ViewModels.ShellViewModel.cs

namespace Test.ViewModels 
{ 
    using Caliburn.Micro; 

    public class ShellViewModel : PropertyChangedBase 
    { 
     public static string txt1 = "String 1"; 
     public static string txt2 = "String 2"; 

     private string title; 
     public string Title 
     { 
      get { return title; } 
      set 
      { 
       if (title != value) 
       { 
        title = value; 
        RaisePropertyChangedEventImmediately("Title"); 
       } 
      } 
     } 

     public ShellViewModel() 
     { 
      Title = "Hello Caliburn.Micro"; 
     } 
    } 
} 

Views.Window1View.xaml

<Window x:Class="Test.Views.Window1View" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:c="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro" 
     Title="Window 1" Height="300" Width="300"> 
    <Grid> 
     <Label Content="TextBox 1" Height="26" HorizontalAlignment="Left" Margin="12,40,0,0" Name="label1" VerticalAlignment="Top" Width="75" /> 
     <TextBox Height="29" HorizontalAlignment="Left" Margin="106,39,0,0" Name="txtBox1" VerticalAlignment="Top" Width="145" Text="{Binding myStr1}" /> 
    </Grid> 
</Window> 

View.Window1View.xaml.cs

using System.Windows; 

namespace Test.Views 
{ 
    /// <summary> 
    /// Interaction logic for Window1View.xaml 
    /// </summary> 
    public partial class Window1View : Window 
    { 
     public Window1View() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

ViewModels.Window1ViewModel.cs

namespace Test.ViewModels 
{ 
    class Window1ViewModel 
    { 
     public Window1ViewModel() 
     { 
      myStr1 = ShellViewModel.txt1; 
     } 

     public string myStr1 { get; set; } 
    } 
} 

Bootstrapper.cs

namespace Test 
{ 
    public class Bootstrapper : Caliburn.Micro.Bootstrapper<Test.ViewModels.ShellViewModel> 
    { 
    } 
} 

的App.xaml

<Application 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      x:Class="Test.App"> 
    <Application.Resources> 

    </Application.Resources> 
</Application> 

App.xaml.cs

namespace Test 
{ 
    using System.Windows; 

    public partial class App : Application 
    { 
     Bootstrapper bootstrapper; 

     public App() 
     { 
      bootstrapper = new Bootstrapper(); 
     } 
    } 
} 

任何幫助,將不勝感激。
謝謝
卡梅隆

+0

Wth,man/woman。如果你希望人們看到整個項目只是在某處上傳一個壓縮文件。 – 2011-06-07 21:24:09

回答

0

也許我失去了一些東西,因爲我不熟悉Caliburn.Micro,但我看到一對夫婦的事情會在這裏。

首先,我沒有看到任何將Window1ViewDataContext設置爲Window1ViewModel的實例。

其次,您的Window1ViewModel不是從PropertyChangedBase派生的,並且當您更改myStr1屬性時,不會調用RaisePropertyChanged

0

在MVVM中實現視圖模型通信的常用方法是使用Mediator Pattern。大多數MVVM框架包含一個'Messenger'類,它允許您通過發佈和訂閱事件來分離您的設計。在Caliburn Micro中,調解由EventAggregator類支持。

既然你是新的MVVM,我也建議以下資源:

+0

反對意見,我會定義調查你提到的調解人模式。並感謝資源。 – CarmelR 2011-06-09 05:14:03

0

有幾件事情在這裏:

  1. 您正在使用不必要的代碼。理想情況下,當使用MVVM時,你應該瞄準幾乎沒有代碼。而不是創建一個btnWin1_click處理程序,請命名按鈕並在您的視圖模型上使用相同的名稱實現一個方法。 Caliburn.Micro將根據約定調用視圖模型方法。
  2. 使用x:名稱而不是名稱
  3. 當顯示Window1ViewModel時,您沒有使用Caliburn.Micro來調用窗口顯示。這意味着您的Window1ViewWindow1ViewModel之間不存在任何綁定。如果這是一個單獨的窗口,請使用Caliburn.Micro的WindowManager類型。實例化您的Window1ViewModel,並使用WindowManager類來顯示它。 Caliburn.Micro將根據約定找到合適的視圖,並將視圖綁定到視圖模型。
  4. 如前所述,不是直接在Window1ViewModel(其耦合視圖模型並使Window1ViewModel不可重複使用)直接引用ShellViewModel,而是使用介體模式。 Caliburn.Micro附帶EventAggregator課程 - 您可以從ShellViewModel發佈文字變更,並在Window1ViewModel中訂閱活動。
+0

結賬由Rob開始的3系列文章,瞭解屏幕導航如何工作。 http://devlicio.us/blogs/rob_eisenberg/archive/2010/10/08/caliburn-micro-soup-to-nuts-part-6a-screens-conductors-and-composition.aspx。還要檢查屬於校準下載部分的樣本。 – Chandermani 2011-06-08 13:54:40

+0

謝謝devdigital,你的回覆已經清除了大霧。我會嘗試讓我的示例代碼根據您的建議工作。 – CarmelR 2011-06-09 05:12:24