-2

以前に同様の質問を投稿しましたが、ViewModelからViewにデータを取得する際に問題が発生していました。問題は、ビューにバインドするときに、データが保存されているオブジェクトからデータを取得することにあります。ビュー内のリストボックスにバインドされるアイテムのObservableCollectionにデータを入力するために使用する、3つのアイテムを宣言するクラスを作成しました。これについて正しく行っているかどうかわからないので、説明のために以下に示します。

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を呼び出して、別のページのビューにバインドしようとしています。

MainViewModel.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をビューにバインドしてリストボックスに表示したいと思います。

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

FavoritePage.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.ViewModelMainViewModel

ただし、ListBoxXAMLを誤って定義しています。

アイテムがでどのように表示されるかを定義するには、プロパティ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で、ダニエルが推奨したとおりに実行します。

    <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 に答える