Mat*_*olf 4 c# wpf view mvvm viewmodel
我有一个自定义usercontrol(ChartControl
),我在我的WPF应用程序(MainApp
)中使用,我呈现如下:
<ContentControl Grid.Row="1" Content="{Binding ChartControl, Mode=OneWay}" />
Run Code Online (Sandbox Code Playgroud)
启动MainApp
后,按给定顺序执行以下操作:
MainApp查看MainApp ViewModel ChartControl ViewModel ChartControl视图
我从ChartControl
ViewModel的构造函数中实例化MainApp
ViewModel.问题是在实例化ChartControl
ViewModel之后我还需要ChartControl
从内部调用一个方法MainApp
.
我遇到的问题是,在调用方法作为其viewmodel的一部分之前,我需要ChartControl
渲染视图(InitializeComponent
执行它).
我认为一个解决方案可能是在完全实例化和设置时从视图中通知视图模型.这是一个可行的解决方案,如果是,我该怎么做?
总之,我需要在调用匹配的viewmodel的方法之前完全设置视图.我遇到的问题是,在这种情况下,视图模型首先被实例化,然后才会呈现视图.
有任何想法吗?
谢谢
您可以使用Interactivity触发器在任何UI事件上触发VM上的Command
您可以像下面一样监听UserControl的Loaded事件,并将其绑定到VM上的Command:
<UserControl x:Class="Test.TestView.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
x:Name="myControl" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding ElementName=myControl, Path=OnLoadedCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
Run Code Online (Sandbox Code Playgroud)
确保你的VM中有Command
public ICommand OnLoadedCommand { get; private set; }
public MyUserControl()
{
OnLoadedCommand = new DelegateCommand(OnLoaded);
}
public void OnLoaded()
{
}
Run Code Online (Sandbox Code Playgroud)
连接Loaded事件的另一种方法,基本上呈现与nit的答案相同的结果,只是在视图的构造函数中引用您的viewmodel并添加一个事件处理程序,该处理程序又调用您需要调用的任何方法,如下所示:
public MyControl()
{
InitializeComponent();
this.Loaded += (s, e) => { ((MyViewModel)DataContext).MyInitializer(); };
}
Run Code Online (Sandbox Code Playgroud)
如果您发现语法令人困惑,您可能需要阅读匿名方法和订阅事件处理程序(使用匿名方法).
归档时间: |
|
查看次数: |
2578 次 |
最近记录: |