2015-04-13 2 views
-1

Снова у меня есть проблема:Свойства привязки двух разных ViewModels

У меня есть два существующих шаблона MVVM. Все модели ViewModels основаны на ViewModelBase света MVVM.

PlugList - PlugListViewModel - PlugListView (Показывает список заглушек) Plug - PlugViewModel - PlugView (отображает свойства конкретной заглушки)

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

PlugListViewModel_Window - PlugListView_Window

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
     <ColumnDefinition Width="5"/> 
     <ColumnDefinition/> 
    </Grid.ColumnDefinitions> 
    <View:View_PlugList x:Name="PlugListView" DataContext="{Binding Path=ViewModel_PlugList, UpdateSourceTrigger=PropertyChanged}" Grid.Column="0"/> 
    <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Stretch" /> 
    <View:View_Plug x:Name="PlugList" DataContext="{Binding ViewModel_Plug}" Grid.Column="2"/> 
</Grid> 

ViewModel

class ViewModel_PlugListWindow : ViewModelBase 
{ 
    public ViewModel_PlugListWindow() 
    { 
    } 

    private const string ViewModel_PlugList_PropertyName = "ViewModel_PlugList"; 
    private ViewModel_PlugList _ViewModel_PlugList; 
    public ViewModel_PlugList ViewModel_PlugList 
    { 
     get 
     { 
      return _ViewModel_PlugList; 
     } 
     set 
     { 
      _ViewModel_PlugList = value; 
      RaisePropertyChanged(ViewModel_PlugList_PropertyName); 
     } 
    } 

    private const string ViewModel_Plug_PropertyName = "ViewModel_Plug"; 
    private ViewModel_Plug _ViewModel_Plug; 
    public ViewModel_Plug ViewModel_Plug 
    { 
     get 
     { 
      return _ViewModel_Plug; 
     } 
     set 
     { 
      _ViewModel_Plug = value; 
      RaisePropertyChanged(ViewModel_Plug_PropertyName); 
     } 
    } 
} 

Все свойства в ViewModels определяются подобно следующий пример:

private const string SelectedPlugPropertyName = "SelectedPlug"; 
private RaControlPlug _SelectedPlug; 
public RaControlPlug SelectedPlug 
{ 
    get 
    { 
     return _SelectedPlug; 
    } 
    private set 
    { 
     _SelectedPlug = value; 
     RaisePropertyChanged(SelectedPlugPropertyName); 
    } 
} 

PlugListView:

<UserControl x:Class="RaControlRuleConfig.View.View_PlugList" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"    
      xmlns:ViewModel="clr-namespace:RaControlRuleConfig.ViewModel" 
      xmlns:local="clr-namespace:RaControlRuleConfig" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <StackPanel> 
     <Button Content="Add Plug" Command="{Binding AddPlugCommand}"/> 
     <ListView ItemsSource="{Binding PlugList}" SelectedItem="{Binding SelectedPlug}"> 
      <ListView.ItemTemplate> 
       <HierarchicalDataTemplate DataType="{x:Type local:RaControlPlug}"> 
        <TextBlock Text="{Binding Name}"/> 
       </HierarchicalDataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </StackPanel> 
</UserControl> 

Теперь я хотел бы связать переменную PlugListViewModel к PlugViewModel. (SelectedPlug должен быть штепсель в PlugViewModel.

Как организовать это?

Спасибо!

+1

'Теперь я хотел бы привязать переменную PlugListViewModel к PlugViewModel.' И это не имеет смысла. – Will

+0

Это не MVVM, как я его знаю. У вас есть, по-видимому, одна модель для одной viewmodel для одного представления. Я не собираюсь говорить, что это неправильно, но это кажется необычным. Можете ли вы опубликовать любой код, который показывает, как ваш PlugListView объединяется? – goobering

+0

Я предоставил вам еще несколько кодов. Этот парень делает это правильно? [link] (http://www.dotnetcurry.com/showarticle.aspx?ID=1037) – MisterPresident

ответ

0

У тебя не довольно получил образец вниз вправо. Ваш связанный пример использует MainViewModel для обеспечения логики резервирования как для представления SingleUser, так и для представления UserList. Поскольку они используют один и тот же ViewModel, оба представления работают из одних и тех же значений свойств. Между представлениями нет связи. Представления просто показывают данные из той же ViewModel.

Ваш код выше показывает ViewModel классы, что и вызывает проблемы. По-моему, у вас должен быть один класс ViewModel, имеющий дело со всей логикой, связанной с Plug. Это ViewModel вероятно, будет иметь:

ObservableCollection<Plug> Plugs 
Plug SelectedPlug 

Где Вилки является ItemsSource для ListView в вашем публикуемую коде, и SelectedPlug является SelectedItem.

+0

Невозможно использовать два существующих представления в одном представлении? Это не хорошо, потому что я должен генерировать новое представление, полностью равное двум другим. – MisterPresident

+0

Вы можете. Вам необходимо установить DataContext из ваших 2 представлений в * тот же ViewModel *, чтобы он вел себя так же, как и код в указанной вами ссылке. Чтобы ViewModel должен обладать свойствами, которые соответствуют свойствам, необходимым для вашего представления. – goobering

+0

Это мера, я должен реализовать savecommands и т. Д. Дважды? :( – MisterPresident

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