我有一個HelloWorldWPFApplication
級以下方法:如何設置模型在模型(MVVM)
public override void Run()
{
var app = new System.Windows.Application();
app.Run(new ApplicationShellView());
}
的ApplicationShellView
具有以下XAML:
<winbase:ApplicationShell x:Class="HelloWorldWPFApplication.View.ApplicationShellView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:winbase="clr-namespace:Framework.Presentation.Control.Window;assembly=Framework"
xmlns:vm="clr-namespace:HelloWorldWPFApplication.ViewModel"
Title="{Binding WindowTitle, Mode=OneWay}">
<Window.DataContext>
<vm:ApplicationShellViewModel />
</Window.DataContext>
</winbase:ApplicationShell>
如果我的視圖模型(ApplicationShellViewModel
)具有以下方法,該窗口將標題設置爲「測試」:
public string WindowTitle
{
get
{
return "Test";
}
}
我的問題是我想根據HelloWorldWPFApplication
類中的屬性設置標題。我添加了以下到HelloWorldWPFApplication的基類(使用INotifyPropertyChanged
接口):
private WpfApplicationBase<WpfApplicationDataBase> applicationModel;
public WpfApplicationBase<WpfApplicationDataBase> Application
{
get { return this.applicationModel; }
set { this.Set<WpfApplicationBase<WpfApplicationDataBase>>(ref this.applicationModel, value); }
}
那麼有效,我打算重用現有HelloWorldWPFApplication
對象作爲模型(MVVM)。
我改變了WINDOWTITLE屬性,如下所示:
public string WindowTitle
{
get
{
return String.Format("{0} {1}",
this.applicationModel.Data.FullName,
this.applicationModel.Data.ReleaseVersion).Trim();
}
}
當然,在這個階段我的項目沒有標題創建一個窗口,作爲應用領域還沒有確定。我不想在視圖模型中創建一個新的應用程序對象,因爲它已經存在。我想使用這個現有的對象。達到此目的的最佳方法是什麼?
我對MVVM/WPF非常陌生 - 從我對MVVM的基本理解中,我不想在視圖中放置任何代碼隱藏。我可以在應用程序對象的靜態類上設置一個靜態字段,然後在我的視圖模型中分配這個字段(這是可行的,但不確定具有「全局」變量是最好的方法)。
我也嘗試在顯示窗口之前創建視圖模型,但遇到了一個我尚未解決的問題。在此實現我的run方法如下所示:
public override void Run()
{
var window = new ApplicationShell(); // inherits from System.Windows.Window
var vm = new ApplicationShellViewModel();
vm.Application = this; // this line won't compile
window.DataContext = vm;
this.Data.WpfApplication.Run(window);
}
我得到一個編譯錯誤:
錯誤1無法隱式轉換類型「HelloWorldWPFApplication.Program.HelloWorldApplication」到「Framework.Business.Logic.Program。 Application.WpfApplicationBase」
我很困惑與錯誤作爲我HelloWorldWPFApplication
類從WpfApplicationBase
繼承:
public class HelloWorldApplication<T> : WpfApplicationBase<T>
where T : HelloWorldApplicationData
此外,HelloWorldApplicationData繼承自WpfApplicationDataBase。
我得到了非常具有以下實現了同樣的問題:
public override void Run()
{
var window = new ApplicationShell();
var vm = new ApplicationShellViewModel();
var app = new HelloWorldApplication<HelloWorldApplicationData>();
vm.Application = app; // Cannot implicitly convert type error again
window.DataContext = vm;
this.Data.WpfApplication.Run(window);
}
確切錯誤:
錯誤1無法隱式轉換類型「HelloWorldWPFApplication.Program.HelloWorldApplication」到「Framework.Business。 Logic.Program.Application。WpfApplicationBase'
所以澄清; 'ApplicationShellViewModel'有一個'Application'屬性,它是'WpfApplicationBase'的一個實例,它有一個'WindowTitle'屬性? –
Unflux
2014-11-21 17:02:30
ApplicationShellViewModel具有WindowTitle屬性,您說的所有內容都是正確的 – camelCase 2014-11-21 17:10:06