-2

我之前发布了一个类似的问题,但是我在将数据从 ViewModel 获取到 View 时遇到了问题。问题在于在绑定到视图时从存储数据的对象中取出数据。我创建了一个声明 3 个项目的类,我用它们来帮助填充将绑定到视图中的 ListBox 的项目的 ObservableCollection。我不确定我是否正确地解决了这个问题,所以为了说明,我将在下面显示:

ListItem.cs(这是我为帮助填充项目集合而定义的自定义类)

public string Favicon
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }

    public string Address
    {
        get;
        set;
    }

MainPage.xaml.cs (这里我要保存要添加到 ObservableCollection 中的每个项目的数据)

void addToFavorites_Click(object sender, EventArgs e)
    {
        var favoriteItem = new ListItem { Favicon = "/Image/1.jpg", Name = "item1", Address = "some address" };
        Settings.FavoritesList.Value.Add(favoriteItem);            
    }

Settings.cs(用于存储FavoritesList ObservableCollection的设置类)

public class Settings
{
    public static Setting<ObservableCollection<ListItem>> FavoritesList = new Setting<ObservableCollection<ListItem>>("Favorites", new ObservableCollection<ListItem>());
}

现在我试图FavoritesList在我的 ViewModel 中调用这个存储的 ObservableCollection,以便我可以将它绑定到另一个页面中的视图。

主视图模型.cs

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

public MainViewModel()
    {
        FavoriteItems = Settings.FavoritesList.Value;
    }

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

然后在导航到我的 FavoritesPage.xaml 时,我想将 ViewModel 绑定到要在列表框中显示的视图

收藏页面.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>

收藏夹页面.xaml.cs

public FavoritesPage()
    {
        InitializeComponent();

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

现在由于某种原因我无法设置DataContext = App.ViewModel;. 我相信我将问题范围缩小到最初使用 ListItem 类保存 MainPage.xaml.cs 中的值时。我不确定如何从这里填充 ListPicker?我在某处做错了什么,还是我应该做一些不同的事情来正确设置数据上下文?

4

2 回答 2

2

的设置DataContext看起来没有错,只要App.ViewModel正确设置为您的MainViewModel类的实例即可。

但是,您错误地定义了 ListBox XAML。

为了定义您的项目将如何显示在 a 中ListBox,您必须使用该ItemsControl.ItemTemplate属性。

<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>
于 2012-09-18T08:19:00.397 回答
1

在 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;
        }
    }

在您的 Xaml 中,按照 Daniel 的建议进行操作:

    <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>

在您的 MainViewModel.cs 中执行以下操作:

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

现在你DataContext = App.ViewModel应该工作了。

实施如图所示的 IS设置

于 2012-09-18T08:59:57.683 回答