相关疑难解决方法(0)

WPF:如何在代码隐藏中没有代码的情况下将ViewModel中的事件发送到View?

我很简单(我希望:))问题:

在MVVM中,View通常会侦听ViewModel属性的更改.但是,我有时会喜欢听事件,例如,当VM发出信号时,View可以启动动画或关闭窗口.

通过带有NotifyPropertyChanged的bool属性(并且只有当它从false变为true时才开始动画)可以做到这一点,但感觉就像是一个hack,我更喜欢暴露事件,因为它在语义上是正确的.

此外,我想在代码隐藏中没有代码的情况下这样做,因为这样做viewModel.myEvent += handler意味着我已经手动取消注册事件以允许View为GC'd - WPF视图已经能够弱地监听属性',而且我更喜欢在View中以声明方式编程.

标准的强事件订阅也很糟糕,因为我需要为一个View切换多个ViewModel(因为每次创建View需要占用太多的CPU时间).

感谢您的想法(如果有标准的解决方案,msdn的链接就足够了)!

wpf events view mvvm viewmodel

40
推荐指数
1
解决办法
3万
查看次数

在视图模型中使用XAML资源

我有几个在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)

这些符号以编程方式添加到地图中,但我需要在我的视图模型中访问它们.

c# wpf resources xaml

10
推荐指数
2
解决办法
1万
查看次数

标签 统计

wpf ×2

c# ×1

events ×1

mvvm ×1

resources ×1

view ×1

viewmodel ×1

xaml ×1