Как установить параметр из родительского представления в модель представления, которая объявлена ​​как статический ресурс в пользовательском элементе управления - PullRequest
1 голос
/ 02 ноября 2011

У меня есть следующий (сокращенный) silverlight xaml для представления / модели представления:

<UserControl x:Class=MyView>    
    <UserControl.Resources>
        <MyViewModel x:Name="MyViewModel"/>
    </UserControl.Resources>

    <Grid DataContext="{Binding Source={StaticResource MyViewModel}}">
<UserControl>

Надеюсь, это вам всем знакомо.

Однако я хотел бы создать 2 экземпляраэтого же пользовательского элемента управления представлением, но для передачи параметра в модель представления, чтобы позволить мне иметь немного отличающиеся данные модели представления, основанные на свойстве, которое я передаю в модель представления.Примерно так:

<UserControl x:Class=MyView>    
    <UserControl.Resources>
        <MyViewModel x:Name="MyViewModel" Filter="Some value set at a higher level"/>
    </UserControl.Resources>

    <Grid DataContext="{Binding Source={StaticResource MyViewModel}}">
<UserControl>

Проблема в том, что я не могу жестко закодировать параметр Filter внутри пользовательского элемента управления, но мне нужно установить его на более высоком уровне.Есть ли способ получить параметр фильтра сверху вниз через привязку, и как будет выглядеть синтаксис.Я надеялся что-то вроде следующего:

Либо непосредственно от родителя что-то вроде:

<MyView>
    <MyView.ViewModel Filter="All">
</MyView>
<MyView>
    <MyView.ViewModel Filter="Some">
</MyView>

Или из пользовательского контроля, глядя вверх, что-то вроде:

<UserControl.Resources>
    <MyViewModel x:Name="MyViewModel" Filter="{Binding FilterTypeFromDataContextHigherUpTheTree}"/>
</UserControl.Resources>

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

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

Реальный вопрос в том, как передать параметр впросмотр модели со статическим ресурсом

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

Хотя ViewModel можно сохранить как ресурс, мы обычно видим ViewModel, установленный как DataContext представления.Затем, если кому-то нужен доступ к ViewModel через View, они просто приводят DataContext к соответствующему типу ViewModel и получают прямой доступ к его свойствам.

Если вы хотите пройти маршрут Binding дляВаш фильтр у вас есть несколько вариантов.Вы можете установить Bnding Soure в RelativeSource.TemplatedParent, если дочерний элемент управления размещен внутри родительского элемента управления в шаблоне (или стиле).Вы также можете использовать ElementName, но только если именованный элемент находится внутри той же области (в вашем примере выше, именованный элемент должен быть где-то внутри MyView).

Последний вариант, который я могу придуматьбыло бы выставить DependencyProperty для фильтра на MyView, а затем установить привязку ViewModel к этому свойству.Это эффективно создало бы пузырьковый фильтр, чтобы он был доступен за пределами MyView, но этот подход мне совсем не нравится, потому что он добавляет свойства в View только ради передачи их в ViewModel.Этого никогда не должно случиться.ViewModel всегда должен быть доступен независимо от View, поэтому я рекомендую выставлять его через свойство DataContext (вывод) или через пользовательское свойство специально для ViewModel (явное).

0 голосов
/ 02 ноября 2011

Иногда я делаю это с моими ViewModels (например, создаю их экземпляр как ресурс).Когда я делаю это, мои виртуальные машины расширяют DependencyObject, по причинам, которые я подробно опишу позже.

Я бы порекомендовал вам переместить их в app.xaml и определить их как ресурсы приложения, где они будутбыть доступным каждому в качестве ресурса приложения.Таким образом, вы можете

<UserControl
    DataContext="{StaticResource MyViewModel}" />

Кроме того, вы можете связывать свойства ваших ViewModels вместе .Вот почему я расширяю DependencyObject.

Конечно, это ограничивает вас одним экземпляром MyViewModel, который может работать или не работать в вашем случае.Если это не сработает, я определю ViewModel, который содержит общие данные, а затем свяжется с этим через статический ресурс, как в вашем примере «смотреть вверх».

...