2014-02-05 4 views
0

В настоящее время я создаю usercontrol в wpf, который состоит из нескольких «экранов», которые пользователь нажимает.Свойство зависимостей Pass для дочернего представления

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

Для каждого «экрана» я создал представление с его собственной моделью (например, View1.xaml, View2.xaml). Главный UserControl может затем получить доступ к этим просмотров:

<UserControl.Resources> 
    <local:ModuleBaseViewModel x:Key="ViewModelDataSource" /> 
</UserControl.Resources> 

<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource ViewModelDataSource}}"> 
<Grid Background="#FF054549"> 
    <local:View1 Visibility="Visible"/> 
    <local:View2 Visibility="Hidden"/> 
    </Grid> 
</Grid> 

Теперь у меня есть некоторые свойства, которые я хотел бы поделиться между каждым видом (например, цвет фона). Если я поместил это свойство в основную модель просмотра usercontrol, он будет проигнорирован, потому что у каждого представления есть DataContext, установленный в его собственную модель представления.

Есть ли способ передать свойство в каждую из режимов просмотра без необходимости его дублирования? Или я делаю это совершенно неправильно?

Спасибо!

ответ

0

Существует несколько способов достижения этой цели.

Одним из решений может быть то, что ViewModels для View1, View2 и т. Д. Имеет свойство CommonViewModel, содержащее один и тот же объект и привязанный к нему.

<Grid Backround={Binding CommonSettings.Background} /> 

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

<Usercontrol ...> 
    <Grid Backround={Binding DataContext.Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid}} /> 
</UserControl> 
+0

Спасибо, относительная привязка работает красиво (хотя делает код привязки довольно длинным)! – user2424495

0

Будет ли лучший способ использовать ResourceDictionary и ссылаться на него в ресурсах каждого вида? Затем в словаре ресурсов я могу добавить фон SolidColorBrush и привязать цвет к свойству?

+0

Это работает так же, но может и не быть лучшим подходом, если вам нужно связать несколько нестандартных пользовательских свойств. Прежде чем связывание RelativeSource существовало для Silverlight, я использую RelayBinding, которое вы добавили в качестве ресурса и использовали для передачи привязки к дочерним элементам. –

Смежные вопросы