我在XAML标记中声明了几个资源,并希望访问视图模型中的资源。我可以轻松地使用foo.Resources["resourceKey"] or findResource("")
,但这意味着我必须将XAML和C#代码紧密结合在一起。这不是我开始使用MVVM时打算做的。
是否有最佳实践或任何方法来使用视图模型中的视图中定义的资源?
更新:
资源主要是符号定义,用于定义ESRIMap中符号的外观。例如:
<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>
这些符号是通过编程方式添加到Map中的,尽管我需要在视图模型中访问它们。
3条答案
按热度按时间yuvru6vn1#
如果您真的想从视图模型层访问样式/模板,您可以做的一件事是将样式放在一个单独的ResourceDictionary中(假设您将其命名为
SymbolTemplates.xaml
),并将其加载到:(我发现,如果将
SymbolTemplates.xaml
的Build Action设置为Content,这种方法效果最好。)一个更MVVM的方法是让视图模型层公开每个符号的“类型”。这个类型将决定应用到视图中的每个符号的模板或样式。然后,您可以使用IValueConverter将符号的类型转换为要应用的样式或模板。这个值转换器需要加载资源字典,但是由于值转换器位于视图层中,不会破坏MVVM。
cidc1ykv2#
首先,您可能会问自己,为什么要从VM访问XAML资源。
从VM访问和操作XAML资源的方法有很多,问题还是在于,为什么要这样做。
例如,如果您想要运行动画,最好从VM触发一个事件,然后在UI上运行动画,而VM不知道该特定动画(请查看此示例)。
ViewModel的目标是保持它的UI独立性,所以尽最大努力将它们分离。
flmtquvp3#
您可以获得应用程序范围的xaml资源。