2014-11-05 45 views
1

我正嘗試在MVVM模式之後的WAF框架的基礎上創建應用程序。目前,我的解決方案由兩個項目(每個項目配備了MEF和MAF引用)的:未插入視圖值,但從ViewModel中檢索

  • *。應用(控股控制器和的ViewModels)
  • * .Presentation(控股實際視圖文件)

我通過ViewModel接口創建視圖和視圖模型之間的綁定 - 請參閱下面的代碼段。此外,所有類都可以通過App.xaml.cs文件內的MEF框架獲得。在這裏,控制器也被初始化。在最簡單的情況下,我想在主窗口的標籤中顯示一個字符串值。

這裏的問題是:如果我啓動應用程序,第二個標籤的值只顯示後退值,但是屬性的get方法正確調用(通過調試模式選中)。 View和ViewModel之間的綁定似乎是正確的 - 如果我將xaml中的綁定路徑更改爲不存在的屬性,我會得到一個輸出,該屬性無法在ViewModel中找到。我的印象是,視圖更新的事件可能存在問題?有關這種奇怪行爲的任何建議?

這裏是視圖模型的專家:

[Export] 
public class MainWindowViewModel : ViewModel<IMainWindowView> 
{ 
    private string _labelContent; 
    public string LabelContent 
    { 
     get { return _labelContent; } 
     set { SetProperty(ref _labelContent, value); } 
    } 

    [ImportingConstructor] 
    public MainWindowViewModel(IMainWindowView view) : base(view) 
    { 
    } 
} 

這裏是控制器的exerpt:

[Export(typeof(IMainWindowController))] 
public class MainWindowController : IMainWindowController 
{ 
    private MainWindowViewModel _mainWindowViewModel; 
    public MainWindowViewModel MainWindowViewModel 
    { 
     get { return _mainWindowViewModel; } 
     set { _mainWindowViewModel = value; } 
    } 

    [ImportingConstructor] 
    public MainWindowController(MainWindowViewModel mainWindowViewModel) 
    { 
     _mainWindowViewModel = mainWindowViewModel; 
    } 

    public void Initialize() 
    { 
     _mainWindowViewModel.LabelContent = "stfu"; 
    } 
} 

視圖接口:

public interface IMainWindowView : IView 
{ 
} 

和視圖本身:

[Export(typeof(IMainWindowView))] 
public partial class MainWindow : Window, IMainWindowView 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 
} 


<Window x:Class="MyCompany.Product.Redesign.Presentation.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
     <Label Content="Test" /> 
     <Label Name="MyLabel" Content="{Binding Path=LabelContent, FallbackValue=Fallback}" /> 
    </StackPanel> 
</Window> 
+0

你的viewmodel是否實現'INotifyPropertyChanged'?屬性設置者是否會提出'PropertyChanged'事件來通知有關更改的視圖? – nabulke 2014-11-05 10:06:05

+0

當然,這是通過ViewModel 接口完成的 – fstegmaier 2014-11-05 11:33:58

回答

0

你肯定,那就是真顯示的視圖是要設置的屬性視圖模型,實例的實例?

首先,請確保您沒有設置爲應用程序的的StartupUri,物業在App.xaml中的視圖。然後確保您通過ViewModel調用了View.Show()。你是那麼肯定的是,你真的設定正在顯示的實例的屬性:

的App.xaml

<Application <!-- note: no StartupUri Property --> 
     x:Name="App" x:Class="YourProject.Presentation.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     ShutdownMode="OnMainWindowClose"> 
</Application> 

MainViewController.cs(在IMainViewController.cs方法聲明)

public void Run() 
{ 
    _mainWindowViewModel.Show(); 
} 

App.xaml.cs

_controller = mainExportProvider.GetExportedValue<IMainViewController>(); 
_controller.Initialize(); 
_controller.Run(); 

MainViewModel.cs(在IMainViewModel.cs方法聲明)

public void Show() 
{ 
    ViewCore.Show(); 
} 

這應該做的伎倆。否則,您可能會看到一個您沒有參考的視圖實例。因此,您正在ViewModel上設置一個屬性,以顯示未顯示視圖。