【发布时间】:2014-06-20 16:11:30
【问题描述】:
我有一个简单的 Winform MVVM 设置,可以更新开发人员信息,在收到更新通知后,视图会弹出一个对话框,其中包含新的开发人员信息。这些对象是使用来自 XML 配置的 Castle Windsor 容器实例化的。一切正常,直到我将 MVVM 组件更改为瞬态。我在下面提供了一些代码。希望它们就足够了:
class Program
{
static void Main(string[] args)
{
IDeveloper developer = IoC.Container.Resolve<IDeveloper>();
IMVVM viewModel = IoC.Container.Resolve<IMVVM>(new Arguments(new
{ MyDeveloper = developer }));
View view = IoC.Container.Resolve<View>(new Arguments(new
{ MyViewModel = viewModel }));
viewModel.ChangeDeveloperInfo("Mike Wise");
}
}
public class MVVM : IMVVM, INotifyPropertyChanged
{
private IDeveloper developer;
public event PropertyChangedEventHandler PropertyChanged;
public MVVM(IDeveloper MyDeveloper)
{
developer = MyDeveloper;
}
protected void RaiseDeveloperInfoChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler(this, e);
}
}
public void ChangeDeveloperInfo(string strNewName)
{
developer.Name = strNewName;
RaiseDeveloperInfoChanged(new PropertyChangedEventArgs("Name"));
}
public string GetName()
{
return developer.Name;
}
public string GetProgramName()
{
return developer.ProgramName;
}
public string GetWebsite()
{
return developer.Website;
}
public string GetComments()
{
return developer.Comments;
}
}
public abstract class View
{
protected IMVVM ViewModel;
public View(IMVVM MyViewModel)
{
this.ViewModel = MyViewModel;
this.ViewModel.PropertyChanged += new PropertyChangedEventHandler(DeveloperInfoChanged_Handler);
}
protected virtual void DeveloperInfoChanged_Handler(object sender, PropertyChangedEventArgs e)
{
UpdateDisplay();
}
protected abstract void UpdateDisplay();
}
public class WinFormView : View
{
private NAboutDialog about;
public WinFormView(IMVVM viewModel) : base(viewModel)
{
this.about = new NAboutDialog();
}
protected override void UpdateDisplay()
{
about.DeveloperName = this.ViewModel.GetName();
about.ProgramName = this.ViewModel.GetProgramName();
about.Website = this.ViewModel.GetWebsite();
about.Comments = this.ViewModel.GetComments();
about.ShowDialog();
}
}
<component id="developerC"
service="Gtk.WindsorNini.IDeveloper, Gtk.WindsorNini"
type="Gtk.WindsorNini.DeveloperC, Gtk.WindsorNini"
lifestyle="transient">
</component>
<component id="mvvm"
service="Gtk.WindsorNini.IMVVM, Gtk.WindsorNini"
type="Gtk.WindsorNini.MVVM, Gtk.WindsorNini"
lifestyle="transient">
</component>
<component id="gtk_view"
service="Gtk.WindsorNini.View, Gtk.WindsorNini"
type="Gtk.WindsorNini.GtkView, Gtk.WindsorNini"
lifestyle="transient">
</component>
<component id="winform_view"
service="Gtk.WindsorNini.View, Gtk.WindsorNini"
type="Gtk.WindsorNini.WinFormView, Gtk.WindsorNini"
lifestyle="transient">
</component>
请原谅我的长代码。问题实际上是 MVVM 是瞬态的。在这里感谢任何帮助
【问题讨论】:
-
设置为单例是否有效?
-
是的,但我希望每次都能使用新实例调用它
-
你得到什么错误?
-
没有错误。 Debug writer 的输出表明 MVVM PropertyChanged 事件未在瞬态模式下引发。
-
我认为这与您的依赖关系有关,在您的情况下,某些模型依赖于其他模型。 stackoverflow.com/questions/3776975/…
标签: c# mvvm castle-windsor ioc-container