2012-09-18 134 views
0

我在將我的View Model綁定到我的View時遇到問題。我是MVVM的初學者,但我相信我正在實施我的系統(幾乎)。我有一個Model,其中包含的數據是我在View Model中獲得的數據,然後當我的頁面導航到時,我試圖抓取View Model數據並將其綁定到View如何將視圖模型綁定到視圖

我的問題是,我在我的View中有一個ListBox,每個項目有3個對象,我似乎無法爲我的列表中的每個項目正確綁定它。

MainPage.xaml中

<ListBox x:Name="FavoritesListBox" ItemsSource="{Binding FavoriteItems}" 
     SelectionChanged="FavoritesListBox_SelectionChanged"> 

    <StackPanel Orientation="Horizontal" Margin="12,0,12,0"> 
     <Image x:Name="favicon" Source="{Binding Favicon}" 
       Width="50" Height="50"/> 
     <StackPanel> 
      <TextBlock x:Name="favoritesName" Text="{Binding Name}" 
         FontSize="{StaticResource PhoneFontSizeExtraLarge}"/> 
      <TextBlock x:Name="favoritesAddress" 
         Text="{Binding Address}" Margin="12,0,0,0"/> 
     </StackPanel> 
    </StackPanel>     
</ListBox> 

MainPage.xaml.cs中

public FavoritesPage() 
    { 
     InitializeComponent(); 

     // Set the data context of the listbox control to the sample data 
     FavoritesListBox.DataContext = App.ViewModel; 
    } 

App.xaml.cs

private static MainViewModel viewModel = null;   

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

      return viewModel; 
     } 
    } 

個MainViewModel.cs

public ObservableCollection<ItemViewModel> FavoriteItems { get; private set; } 

    public MainViewModel() 
    { 
     //FavoriteItems = new ObservableCollection<ItemViewModel>(); 
     FavoriteItems = Settings.FavoritesList.Value; 
    } 

Settings.cs(模型)

public static Setting<ObservableCollection<ItemViewModel>> FavoritesList = 
    new Setting<ObservableCollection<ItemViewModel>>(
     "Favorites", 
     new ObservableCollection<ItemViewModel>()); 

ItemViewModel.cs

private string _favicon; 
    public string Favicon 
    { 
     get 
     { 
      return _favicon; 
     } 
     set 
     { 
      if (value != _favicon) 
      { 
       _favicon = value; 
       NotifyPropertyChanged("Favicon"); 
      } 
     } 
    } 

    private string _name; 
    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      if (value != _name) 
      { 
       _name = value; 
       NotifyPropertyChanged("Name"); 
      } 
     } 
    } 

    private string _address; 
    public string Address 
    { 
     get 
     { 
      return _address; 
     } 
     set 
     { 
      if (value != _address) 
      { 
       _address = value; 
       NotifyPropertyChanged("Address"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (null != handler) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

..和這是在哪裏以及如何我保存每個項目(應該有三個屬性列在ItemViewModel

void addToFavorites_Click(object sender, EventArgs e) 
{ 
    var favoriteItem = 
     new ItemViewModel{ 
      Favicon = "", 
      Name = "", 
      Address = TheBrowser.currentUrl() }; 
     Settings.FavoritesList.Value.Add(favoriteItem);    
} 

FavoritesList是使用ItemViewModel含有3名對象進行填充。該列表正在填充正確,因爲在調試期間,我可以看到FavoritesList中的實體,但我有一個問題調用view model中的這些實體出現在我的ListBoxview

我相信我綁定不正確,但我不知道如何解決這個問題?

+0

http://stackoverflow.com/questions/12151618/creating-contextbinding-xaml可以幫助你。我一直在做同樣的事情。 – timmy

+0

如果您知道我們將爲您的視圖使用視圖模型來綁定某些屬性,爲什麼我們使用視圖模型的「延遲創建」? –

+0

我在你的XAML中看不到你的'ListBox.ItemTemplate'。你的'ListBox'被填充了一個'ItemViewModel'的集合,但是你需要將'ListBox.ItemTemplate'設置爲一個'DataTemplate',其中包含綁定到'ItemViewModel'的控件來告訴WPF如何繪製每個'ItemViewModel'' – Rachel

回答

0

在您的XAML中,您綁定了路徑NameAddress您是否在您的ItemViewModel中定義了這2個屬性?正確讀取你的代碼後

更新:

你沒有更新的列表框中的項目的DataTemplate中。這是你需要做的:

<ListBox x:Name="FavoritesListBox" ItemsSource="{Binding FavoriteItems}" SelectionChanged="FavoritesListBox_SelectionChanged"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal" Margin="12,0,12,0"> 
       <Image x:Name="favicon" Source="{Binding Favicon}" Width="50" Height="50"/> 
       <StackPanel> 
        <TextBlock x:Name="favoritesName" Text="{Binding Name}" FontSize="{StaticResource PhoneFontSizeExtraLarge}"/> 
        <TextBlock x:Name="favoritesAddress" Text="{Binding Address}" Margin="12,0,0,0"/> 
       </StackPanel> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

是的,一切都在'ItemViewModel'中。似乎ItemsItems中的ItemsItems的observablecollection viewmodel是Project1.ViewModels.ItemViewModel每一次,但其中每一個是我需要公開的哪些屬性正確填充的屬性。 – Matthew

+0

好吧我相信我縮小了我的問題,直到我如何將數據保存在第一位 void addToFavorites_Click(object sender,EventArgs e) var favoriteItem = new ItemViewModel {Favicon =「」,Name =「」,Address = TheBrowser.currentUrl()}; Settings.FavoritesList.Value.Add(favoriteItem); }'。 – Matthew

+0

所以,如果它理解正確,當你調試,你可以看到ListBoxItem上的DataContext是ItemViewModels的實例。是這樣嗎?如果是這種情況,我會建議您發佈ItemViewModel的代碼,以便可以檢查問題出在哪裏。請使用ItemViewModel代碼更新您的問題。 –

0

除了你的DataContext設置爲你的視圖模型,你還需要有您的視圖模型實現INotifyPropertyChanged(包括ItemViewModel,你不要在你的問題顯示)(在評論鏈接到Creating ContextBinding XAML提到)

+0

我已經嘗試了所有這些,但也許這個細節會有所幫助。我注意到在我的列表框中,我看到的是文本「Project1.ViewModels.ItemViewModels」(Project1是我的項目名稱 – Matthew

相關問題