我很简单(我希望:))问题:
在MVVM中,View通常会侦听ViewModel属性的更改.但是,我有时会喜欢听事件,例如,当VM发出信号时,View可以启动动画或关闭窗口.
通过带有NotifyPropertyChanged的bool属性(并且只有当它从false变为true时才开始动画)可以做到这一点,但感觉就像是一个hack,我更喜欢暴露事件,因为它在语义上是正确的.
此外,我想在代码隐藏中没有代码的情况下这样做,因为这样做viewModel.myEvent += handler意味着我已经手动取消注册事件以允许View为GC'd - WPF视图已经能够弱地监听属性',而且我更喜欢在View中以声明方式编程.
标准的强事件订阅也很糟糕,因为我需要为一个View切换多个ViewModel(因为每次创建View需要占用太多的CPU时间).
感谢您的想法(如果有标准的解决方案,msdn的链接就足够了)!
我有几个在XAML标记中声明的资源,并希望访问我的视图模型中的资源.我可以很容易地使用一些东西foo.Resources["resourceKey"] or findResource("")但这意味着我必须将我的XAML和C#代码紧密地结合在一起.当我开始使用MVVM时,不是我打算做的.
是否有最佳实践或以任何方式使用视图模型中视图中定义的资源?
资源主要是符号定义,用于定义ESRI地图中符号的外观.例如:
<esri:MarkerSymbol x:Key="SMS">
<esri:MarkerSymbol.ControlTemplate>
<ControlTemplate>
<Ellipse x:Name="Element" Margin="-7,-7,0,0" Width="14" Height="14" Fill="Blue">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="SelectionStates">
<VisualState x:Name="Unselected" />
<VisualState x:Name="Selected">
<Storyboard>
<ColorAnimation Storyboard.TargetName="Element" Storyboard.TargetProperty="(Ellipse.Fill).(SolidColorBrush.Color)" To="Green" Duration="00:00:0.25"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Ellipse>
</ControlTemplate>
</esri:MarkerSymbol.ControlTemplate>
</esri:MarkerSymbol>
Run Code Online (Sandbox Code Playgroud)
这些符号以编程方式添加到地图中,但我需要在我的视图模型中访问它们.