Использование ресурса XAML в модели представления - PullRequest
10 голосов
/ 18 июля 2011

У меня есть несколько ресурсов, объявленных в разметке 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>

Символы добавляются на карту программно, хотя мне нужно получить к ним доступ в моей модели вида.

Ответы [ 2 ]

11 голосов
/ 18 июля 2011

Если вы действительно хотите получить доступ к стилям / шаблонам из слоя модели представления, одну вещь, которую вы можете сделать, это поместить стили в отдельный ResourceDictionary (предположим, вы назвали его SymbolTemplates.xaml) и загрузить его в:

var resourceDictionary = new ResourceDictionary()
{
    Source = new Uri("SymbolTemplates.xaml", UriKind.Relative)
};

ControlTemplate template = resourceDictionary["SMS"] as ControlTemplate;

(я обнаружил, что этот подход работает лучше всего, если вы установите для параметра «Действие сборки» для SymbolTemplates.xaml значение «Содержимое».)

Более подход MVVM-ish будет состоять в том, чтобы иметь слой модели представления.выставить «тип» каждого символа.Этот тип будет определять шаблон или стиль, который будет применяться к каждому символу, добавленному в представление.Затем вы использовали бы IValueConverter для преобразования типа символа в стиль или шаблон для применения.Этот преобразователь значений должен был бы загрузить словарь ресурсов, но поскольку преобразователи значений живут в уровне представления, это не нарушает MVVM.

6 голосов
/ 18 июля 2011

Сначала подумайте, что вы хотите спросить себя: зачем вам нужен доступ к вашим ресурсам XAML с виртуальной машины.

Есть много способов получить доступ к ресурсам XAML и манипулировать ими с ВМ, вопрос опять же, зачем вам это делать.

Потому что, например, если вы хотите запустить анимацию, вам лучше запустить событие с виртуальной машины и запустить анимацию. в пользовательском интерфейсе без виртуальной машины, чтобы узнать об этой конкретной анимации (см. this для примеров).

Цель ViewModel - сохранить его независимым от пользовательского интерфейса, поэтому сделайте все возможное, чтобы разделить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...