2014-01-15 167 views
3

我有這種情況。 在ShellView我有兩個datapicker:Caliburn.micro將參數從一個屏幕傳遞到另一個屏幕

<DatePicker Grid.Column="0" Margin="8" Padding="5" x:Name="from"/> 
<DatePicker Grid.Column="1" Margin="8" Padding="5" x:Name="to"/> 

和一個按鈕

<Button Grid.Row="2" cal:Message.Attach="[Action RunOtherView($dataContext)]" Content="Go" Margin="8" HorizontalAlignment="Center"/> 

我想,當我選擇這兩個日期,而按下按鈕後,這兩個日期將被傳遞例如在我的例子列表參數中的SecondViewModel。 但在SecondViewModel的構造函數中,「參數」始終爲空。 錯誤在哪裏?我如何將這些參數從一個屏幕傳遞到另一個屏幕? 由於

public class ShellViewModel : Conductor<IScreen>.Collection.OneActive, IShell 
{ 
    protected override void OnActivate() 
    { 
     base.OnActivate(); 
     ActivateItem(IoC.Get<IMainViewModel>()); 
    } 

    public void RunOtherView() 
    { 
     var crvm = IoC.Get<ISecondViewModel>(); 
     crvm.Parameters = new List<DateTime>(); 
     crvm.Parameters.Add((DateTime)d.from); 
     crvm.Parameters.Add((DateTime)d.to); 
     ActivateItem(crvm);          
    } 
} 



public class MainViewModel : Screen, IMainViewModel 
{ 
    public DateTime? from { get; set; } 
    public DateTime? to { get; set; } 
} 



public class SecondViewModel : Screen, ISecondViewModel 
{ 
     public List<DateTime> Parameters { get; set; } 

     protected override void OnActivate() 
     { 
      base.OnActivate(); 
     } 

     public SecondViewModel() 
     { 
      //Parameters is always null 
      PersonalList = CollectionViewSource.GetDefaultView(Db.UpdateInformation(Parameters)); 
     } 


     public override void TryClose(bool? dialogResult) 
     { 
      TryClose(dialogResult); 
     } 
} 
+0

對於'ViewModels'之間的溝通,你可以看到我的[答案](http://stackoverflow.com/questions/20868047/one-viewmodel-for-usercontrol-and-window-or-separate-viewmodels/20873276#20873276 )關於使用模式'Mediator'。 –

回答

3

的ViewModels可以通過EventAggregator被comunicated。您需要創建事件並在偵聽的視圖模型中告訴他們期望的事件。我通常會製作一個「Events」文件夾來放置它。

看看Documentation

實施例:

事件:

public class FooEvent 
     { 
      public FooEvent(bool foo) 
      { 
       Foo = foo; 
      } 

     public bool Foo { get; private set; } 
     } 

第一屏幕

public class FirstViewModel : Screen 
{ 
    private readonly IEventAggregator _events; 

    [ImportingConstructor] 
    public FirstViewModel(IEventAggregator events) 
    { 

     DisplayName = "First screen"; 
     _events = events; 
    } 


    public void PublishFooEvent() 
    { 
     _events.Publish(new FooEvent(true)); 
    } 

第二屏幕

public class SecondViewModel : Screen, IHandle<FooEvent> 
    { 

    private readonly IEventAggregator events; 

    [ImportingConstructor] 
    public SecondViewModel(IEventAggregator events) 
    { 
     DisplayName = "Second screen"; 
     this.events = events; 
     events.Subscribe(this); 
    } 

    public bool Bar{get;set;} 

    public void Handle(FooEvent message) 
    { 
     Bar = message.Foo; 
    } 
} 

希望它有幫助。

+0

但在我的情況下,我怎麼能繼續?你能告訴我應用的變化嗎? Thieks – puti26

+1

我告訴過你:用所需的屬性創建一個事件,在MainViewModel中發佈事件,通過EventAggregator實例設置值,使用IHandle監聽SecondViewModel ,並用你需要的值捕獲事件。 –

相關問題