2016-07-13 19 views
0

Ich kann die Ansicht nicht korrekt an das ViewModel binden. Wenn es angezeigt wird, zeigt es nur die Zeichenfolgenversion von dem ViewModel an.Ansicht bindet nicht korrekt an ViewModel

Ich habe gesehen: Setting Window.Content to ViewModel - simple data template not working. Aber der Link ist nicht mehr verfügbar.

Ich versuche https://msdn.microsoft.com/en-us/magazine/dd419663.aspx als Vorlage zu verwenden.

MainWindow.xaml

<Window x:Class="DemoApp.MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:vm="clr-namespace:DemoApp.ViewModel" 
xmlns:vw="clr-namespace:DemoApp.View"> 

<Window.Resources> 
    <DataTemplate DataType="{x:Type vm:TestViewModel}"> 
     <vw:TestView/> 
    </DataTemplate> 
    <DataTemplate x:Key="ClosableTabItemTemplate"> 
     <DockPanel Width="120"> 
     <Button 
      Command="{Binding Path=CloseCommand}" 
      Content="X" 
      Cursor="Hand" 
      DockPanel.Dock="Right" 
      VerticalContentAlignment="Bottom" 
      Width="16" Height="16"/> 
     <ContentPresenter 
      Content="{Binding Path=DisplayName}" 
      VerticalAlignment="Center"/> 
     </DockPanel> 
     </DataTemplate> 
     <DataTemplate x:Key="WorkspacesTemplate"> 
     <TabControl 
      IsSynchronizedWithCurrentItem="True" 
      ItemsSource="{Binding}" 
      ItemTemplate="{StaticResource ClosableTabItemTemplate}" 
      Margin="4" /> 
    </DataTemplate> 
</Window.Resources> 

    <DockPanel> 
    <Border 
     Grid.Column="2" 
     Style="{StaticResource MainBorderStyle}"> 
     <HeaderedContentControl 
     Content="{Binding Path=Workspaces}" 
     ContentTemplate="{StaticResource WorkspacesTemplate}" 
     Header="Workspaces" 
     Style="{StaticResource MainHCCStyle}" /> 
    </Border> 
    </DockPanel> 
</Window> 

MainWindowViewModel.cs // für Klarheit weggelassen. Dies richtet sich korrekt auf das Ansichtsmodell. Es ist die Bindung zwischen Ansicht und Ansichtsmodell, das nicht

TestView.xaml ist

public class TestViewModel : WorkspaceViewModel, INotifyPropertyChanged, 
{ 
    public Model.Test _test; 
    public string DisplayName {get; set;} 
    public class TestViewModel(Model.Test t) 
    { 
     DisplayName = "Test Display Name"; 
     _model = t; 
    } 
    // INofifyPropertyChanged Members removed for clarity 
} 

Test.cs

public class Test 
{ 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 

    public static DisplayTest() 
    { 
     return new Test(); 
    } 

} 

Displays: DemoApp.ViewModel.TestViewModel;

Allerdings, wenn ich an die MainWindow.xaml gehen und geben Sie tatsächlich in in eine DockPanel, wird es richtig angezeigt ...

Thank you !!

UPDATE: MainWindowViewModel.cs Eigenschaften

public ReadOnlyCollection<CommandViewModel> Commands 
    { 
     get 
     { 
      if (_commands == null) 
      { 
       List<CommandViewModel> cmds = this.CreateCommands(); 
       _commands = new ReadOnlyCollection<CommandViewModel>(cmds); 
      } 
      return _commands; 
     } 
    } 

public ObservableCollection<WorkspaceViewModel> Workspaces 
    { 
     get 
     { 
      if (_workspaces == null) 
      { 
       _workspaces = new ObservableCollection<WorkspaceViewModel>(); 
       _workspaces.CollectionChanged += this.OnWorkspacesChanged; 
      } 
      return _workspaces; 
     } 
    } 
+0

Zeigt Ihr Hauptansichtsmodell eine Eigenschaft an, die eine beobachtbare Sammlung von TestViewModels darstellt? – leetibbett

+0

Zeigen Sie uns die MainWindowViewModel-Eigenschaften –

+0

wo legen Sie Ihren DataContext für Ihre Ansicht fest oder weisen Sie ihn zu? –

Antwort

0

In der Ansicht gibt es einen Datenkontext erklärt. Dies verwirrte die Bindung, die es aussieht. Sobald der Datenkontext in der Ansicht entfernt wurde und MainWindowResourses den Datenkontext beibehalten hat, wird die Ansicht so angezeigt, wie sie sollte.