2011-10-28 4 views
1

Je ne peux pas obtenir mon xaml à lier avec mon viewmodel. J'ai dans mon vueModèle une ObservableCollection d'une classe INotifyPropertyChanged qui contient des données sur une réception. Voici ma classe recepie:lien viewmodel pour voir

namespace WP7SQLiteClient.Model 
{ 
    public class MainViewModelItem : INotifyPropertyChanged 
    { 
     string _title, _subTitle, _imageUriPath; 

     string title 
     { 

      get 
      { 
       return _title; 
      } 
      set 
      { 
       _title = value; 
       NotifyPropertyChanged("title"); 
      } 
     } 
     string subTitle 
     { 
      get 
      { 
       return _subTitle; 
      } 
      set 
      { 
       _subTitle = value; 
       NotifyPropertyChanged("subTitle"); 
      } 
     } 
     string imageUriPath 
     { 
      get 
      { 
       return _imageUriPath; 
      } 
      set 
      { 
       _imageUriPath = value; 
       NotifyPropertyChanged("imageUriPath"); 
      } 
     } 

     public MainViewModelItem(string title, string subtitle, string imageuripath) 
     { 
      this.title = title; 
      this.subTitle = subtitle; 
      this.imageUriPath = imageuripath; 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected void NotifyPropertyChanged(String info) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(info)); 
      } 
     } 
    } 
} 

Et mon ViewModel qui contient la liste des recepies:

namespace WP7SQLiteClient.ViewModel 
{ 

     public class PanoramaViewModel : INotifyPropertyChanged 
     { 
      public ObservableCollection<MainViewModelItem> _recepiesList; 


      public ObservableCollection<MainViewModelItem> recepiesList 
      { 
       get 
       { 
        return _recepiesList; 
       } 

       set 
       { 
        _recepiesList = value; 
        NotifyPropertyChanged("recepiesList"); 
       } 
      } 

      public PanoramaViewModel() 
      { 
       this.recepiesList = new ObservableCollection<MainViewModelItem>(); 

      } 

      public bool IsDataLoaded 
      { 
       get; 
       private set; 
      } 

      public void LoadData() 
      { 
       this.recepiesList.Add(new MainViewModelItem("Classics", "", "")); 
       this.recepiesList.Add(new MainViewModelItem("Perfect Pasta", "", "")); 
       this.recepiesList.Add(new MainViewModelItem("Favorites", "", "")); 
       this.recepiesList.Add(new MainViewModelItem("Snacks & Antipasti", "", "")); 
       this.recepiesList.Add(new MainViewModelItem("Desserts", "", "")); 
       this.recepiesList.Add(new MainViewModelItem("3 minutes recipes", "", "")); 

       this.IsDataLoaded = true; 
      } 


      private string _sampleProperty = "Sample Runtime Property Value"; 
      /// <summary> 
      /// Sample ViewModel property; this property is used in the view to display its value using a Binding 
      /// </summary> 
      /// <returns></returns> 
      public string SampleProperty 
      { 
       get 
       { 
        return _sampleProperty; 
       } 
       set 
       { 
        if (value != _sampleProperty) 
        { 
         _sampleProperty = value; 
         NotifyPropertyChanged("SampleProperty"); 
        } 
       } 
      } 




      public event PropertyChangedEventHandler PropertyChanged; 

      protected void NotifyPropertyChanged(String info) 
      { 
       if (PropertyChanged != null) 
       { 
        PropertyChanged(this, new PropertyChangedEventArgs(info)); 
       } 
      } 
     } 

} 

Dans mon MainPage.xaml (il est à la racine du projet, le viewmodel est dans le ViewModel dossier et le modèle est dans le dossier du modèle) j'ai mon listbox déclaré comme ceci:

<ListBox x:Name="recepiesList" ItemTemplate="{StaticResource ListViewModelTemplate}" > 

       </ListBox> 

le modèle est situé dans le App.xaml et est correcte pour vous. Il utilise des choses comme {Binding title}

Dans les MainPage.cs je tente de relier le modèle de vue avec la page en utilisant:

public static PanoramaViewModel viewModel = null; 

     public static PanoramaViewModel ViewModel 
     { 
      get 
      { 
       // Delay creation of the view model until necessary 
       if (viewModel == null) 
        viewModel = new PanoramaViewModel(); 

       return viewModel; 
      } 
     } 
public MainPage() 
     { 

      InitializeComponent(); 

      ViewModel.LoadData(); 
      DataContext = ViewModel; 

     } 

Mais cela ne fonctionne pas, ni le débogueur déclenche une erreur. Comment puis-je lier correctement le viewmodel avec le xaml?

MISE À JOUR mon modèle ressemble à ceci:

<DataTemplate x:Key="ListViewModelTemplate"> <!-- for recent recepies--> 

      <Grid Width="400" Height="80" VerticalAlignment="Center"> 

       <StackPanel Orientation="Vertical"> 
        <Border CornerRadius="0" x:Name="brdTesat" BorderBrush="Black" BorderThickness="1" Width="80" Height="80"> 

        <Border.Background> 
         <ImageBrush x:Name="backgroundImaageBrush" Stretch="Fill"> 

          <ImageBrush.ImageSource> 

            <BitmapImage x:Name="bmapBackground" UriSource="{Binding imageUriPath}" > 
           </BitmapImage> 

          </ImageBrush.ImageSource> 
         </ImageBrush> 
        </Border.Background> 
       </Border> 
        <StackPanel> 
        <TextBlock TextAlignment="Left" Margin="7,4,4,4" Text="{Binding title}" TextWrapping="Wrap"></TextBlock> 
         <TextBlock TextAlignment="Left" Margin="7,4,4,4" Text="DA" TextWrapping="Wrap"></TextBlock> 
        </StackPanel> 
       </StackPanel> 

      </Grid> 
     </DataTemplate> 

MISE À JOUR 2

j'ai changé mon code listbox:

<ListBox x:Name="recepiesList" ItemsSource="{Binding recepiesList}" >    </ListBox> 

Sans modèle, je reçois une liste de [project_name].Model.MainViewModelItem, donc je pense qu'il y a un problème avec le modèle .. Que suis-je mal faire?

Répondre

2

Vous devez vous lier ListBox aux données. Donc, cela devrait fonctionner pour vous.

<ListBox x:Name="recepiesList" ItemsSource="{Binding recepiesList}" ItemTemplate="{StaticResource ListViewModelTemplate}" /> 
+0

ne fonctionne pas .. je reçois: Une exception de première instance de type 'System.IO.FileNotFoundException' s'est produite dans mscorlib.dll Erreur System.Windows.Data: Erreur de chemin BindingExpression: propriété 'title' introuvable sur 'WP7SQLiteClient. Model.MainViewModelItem '' WP7SQLiteClient.Model.MainViewModelItem '(HashCode = 65782377 – Alex

+0

Soit la chaîne subTitle n'apparaît pas parce que je ne la lie pas, je lui donne une chaîne statique – Alex

+1

Parce que les propriétés de votre viewmodel ne sont pas publiques!Rendre public et être heureux :) –

0

Nous utilisons dans un projet MEF et nous relier la vue des modèles avec le code suivant dans le View.xaml.cs:

[Import] 
public ConnectionStringSetupViewModel ViewModel 
{ 
    get { return DataContext as ConnectionStringSetupViewModel; } 
    set { DataContext = value; } 
} 

Cela permet l'importation d'être satisfaite lorsque les catalogues sont créés . Si vous n'utilisez pas MEF, vous pouvez utiliser le même code ci-dessus sans l'importation, mais lorsque votre vue est créée, vous devrez lui assigner une nouvelle instance de votre classe viewmodel.

+0

Comment attribuer une nouvelle instance de ma classe viewmodel? Je ne suis pas sûr de ce que vous voulez dire – Alex

+0

PanaromaView p = new PanaromaView(); p.ViewModel = nouveau PanaromaViewModel(); –

+0

J'ai ajouté un UPDATE2, s'il vous plaît regarder – Alex

Questions connexes