2

これは私の C# コードです。現在、コンソールにデータが表示されています。

class PlaceViewModel
    {

        public List<Vantaa.IntroPage.Place> Places;
    }       

public class Place
            {
                public string id { get; set; }
                public string title { get; set; }
                public string latitude { get; set; }
                public string longitude { get; set; }
                public string www { get; set; }
            }

        public class RootObject
        {
            public List<Place> Places { get; set; }
        }

    protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            WebClient webClient = new WebClient();
            webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
            webClient.DownloadStringAsync(new Uri("http://mobiilivantaa.lightscreenmedia.com/api/place"));
        }

        private void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            var rootObject = JsonConvert.DeserializeObject<RootObject>(e.Result);

            foreach (var book in rootObject.Places)
            {
                System.Diagnostics.Debug.WriteLine(book.id);
            }
            this.DataContext = new PlaceViewModel
                 {
                      Places = rootObject.Places
                 };
            }

textblock にデータを表示するには、xaml ファイルをどうすればよいですか?

これは私の現在のxamlコードです。それは確かに機能していません。本当にわからない。

<ListBox ItemsSource="{Binding Places}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock Text="{Binding Path=id}" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
4

2 に答える 2

5

クラスコードは見栄えが良いので、結果をビューにバインドするだけです。オブジェクトのリストを返すため、複数のアイテムの表示をサポートするコントロールを使用する必要があります。もちろん、書籍のすべての ID を 1 つの文字列に連結して、ラベルに表示することもできます。しかし、これはそれが行われた方法ではありません。XAML に ListBox コントロールを追加し、その中に DataTemplate を作成する必要があります。このようにして、アイテムの表示方法を設定します。

XAML ページの ViewModel となるクラスを作成します。このクラスには、プロパティ「Places」 (タイプ: List<Place>) があります。すべてのデータの取得が完了したら、OnNavigatedTo イベントで、ViewModel に入力し、XAML の DataContext にバインドしてバインドします。

this.DataContext = new YourViewModel { Places = rootObject.Places };

このようにして、XAML で ViewModel からすべてのオブジェクトを取得できます。

<ListBox ItemsSource="{Binding Places}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <TextBlock Text="{Binding Path=id}" />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

編集:

これが実際の例です:

XAML:

<Grid>
    <ListBox ItemsSource="{Binding Places}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=ID}" />
                    <TextBlock Text="{Binding Path=Title}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

Place.cs:

public class Place
{
    public string ID { get; set; }
    public string Title { get; set; }
    public string Latitude { get; set; }
    public string Longitude { get; set; }
    public string Web { get; set; }
}

MainViewModel.cs:

public class MainViewModel
{
    public MainViewModel()
    {
        Places = new List<Place>();
    }

    public List<Place> Places { get; set; }
}

サンプル リポジトリ (独自のものを用意する必要があります):

public static List<Place> FetchData()
{
    var lst = new List<Place>();

    lst.Add(new Place { ID = "1", Title = "One", Latitude = "111", Longitude = "111", Web = "www......" });
    lst.Add(new Place { ID = "2", Title = "Two", Latitude = "222", Longitude = "222", Web = "www......" });
    lst.Add(new Place { ID = "3", Title = "Three", Latitude = "333", Longitude = "333", Web = "www......" });
    lst.Add(new Place { ID = "4", Title = "Four", Latitude = "444", Longitude = "444", Web = "www......" });

    return lst;
}

MainWindow.xaml.cs:

public MainWindow()
{
    InitializeComponent();
    //This is where the magic happens
    //Fill the viewModel with the data
    var viewModel = new MainViewModel { Places = Repository.FetchData() };
    //Assign the viewModel with the data to the DataContext
    //The bindings will be automatically done in the XAML
    DataContext = viewModel;
}
于 2013-01-04T08:36:19.530 に答える
2

PlaceViewModelクラスはINotifyProprtyChangedインターフェイスを実装する必要があり、バインドするすべてのプロパティはセッターで変更を通知する必要があります。

バインドされたテキストブロックの値を更新できるようにするために、プロパティはその変更を通知できます。

例: http: //msdn.microsoft.com/en-us/library/ms229614.aspx

于 2013-01-04T18:19:49.683 に答える