2017-01-02 4 views
0

ListViewアイテムをユーザーコントロール内にバインドしたいと思います。このリスト内にカスタム形式のテキストを表示します。UWP:User Control ListView DataTemplateデータ型バインド

ユーザーコントロールなしでこれを実行しました。したがって、次のコードはうまく働いていた:

<StackPanel Grid.Row="2" Grid.ColumnSpan="2" Orientation="Horizontal" HorizontalAlignment="left"> 
      <ListView ItemsSource="{x:Bind WeatherViewModel.WeatherForecast}" > 
       <ListView.ItemTemplate> 
        <DataTemplate x:DataType="local:WeatherForecast"> 
         <Grid> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="30"/> 
           <RowDefinition Height="*" /> 
           <RowDefinition Height="*" /> 
          </Grid.RowDefinitions> 

          <!-- temperature --> 
          <Grid Grid.Row="0"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="47"/> 
            <ColumnDefinition Width="10"/> 
            <ColumnDefinition Width="47"/> 
           </Grid.ColumnDefinitions> 
           <TextBlock Text="{x:Bind MaxTemperature}" 
              FontSize="16" 
              Grid.Column="0"            
              FontFamily="Sergoe UI" 
              HorizontalAlignment="Right" 
              VerticalAlignment="Center" 
              Style="{StaticResource BasicTextBlock}"/> 
           <TextBlock Text="|" 
              FontSize="16" 
              Grid.Column="1" 
              FontFamily="Sergoe UI" 
              HorizontalAlignment="Center" 
              VerticalAlignment="Center" 
              Style="{StaticResource BasicTextBlock}"/> 
           <TextBlock Text="{x:Bind MinTemperature}" 
              FontSize="16" 
              Grid.Column="2" 
              FontFamily="Sergoe UI" 
              HorizontalAlignment="left" 
              VerticalAlignment="Center" 
              Style="{StaticResource BasicTextBlock}"/> 
          </Grid> 
          </TextBlock> 
         </Grid> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
       <ListView.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Horizontal"></StackPanel> 
        </ItemsPanelTemplate> 
       </ListView.ItemsPanel> 
       </ListView> 
     </StackPanel> 

次は私がこのリストビュー

<StackPanel Orientation="Horizontal" HorizontalAlignment="left"> 
     <ListView ItemsSource="{Binding Path=.}"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="30"/> 
          <RowDefinition Height="*" /> 
          <RowDefinition Height="*" /> 
         </Grid.RowDefinitions> 

         <!-- temperature --> 
         <Grid Grid.Row="0"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="47"/> 
           <ColumnDefinition Width="10"/> 
           <ColumnDefinition Width="47"/> 
          </Grid.ColumnDefinitions> 
          <TextBlock Text="{Binding MaxTemperature}" 
              FontSize="16" 
              Grid.Column="0"            
              FontFamily="Sergoe UI" 
              HorizontalAlignment="Right" 
              VerticalAlignment="Center" 
              Style="{StaticResource BasicTextBlock}"/> 
          <TextBlock Text="|" 
              FontSize="16" 
              Grid.Column="1" 
              FontFamily="Sergoe UI" 
              HorizontalAlignment="Center" 
              VerticalAlignment="Center" 
              Style="{StaticResource BasicTextBlock}"/> 
          <TextBlock Text="{Binding MinTemperature}" 
              FontSize="16" 
              Grid.Column="2" 
              FontFamily="Sergoe UI" 
              HorizontalAlignment="left" 
              VerticalAlignment="Center" 
              Style="{StaticResource BasicTextBlock}"/> 
         </Grid> 

         </TextBlock> 
        </Grid> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
      <ListView.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal"></StackPanel> 
       </ItemsPanelTemplate> 
      </ListView.ItemsPanel> 
     </ListView> 
    </StackPanel> 

のためのユーザーコントロールを作成しようとした私は、このビューのDataContextのセット

this.WeatherForecastView.DataContext = this.WUWeatherViewModel.Forecast; 

しかし、どのようにDataTemplateのデータ型を定義できますか? ListViewのItemSourceのバインディングは正しいですか?

+0

のItemsSource = "{バインディングWeatherForecast}"、DataTyp eはxにのみ必要です:バインディングをコンパイル時に作成し、バインドするオブジェクトのタイプを知る必要があるためバインドを必要としません。バインディング原因は現在のDataContextに応じて実行時に解決されます実際のタイプは – RTDev

答えて

1

ListViewのItemSourceのバインディングは正しいですか?

はい、(おそらく親ユーザーコントロールの場合と同じである)のStackPanelのDataContextのは、IEnumerableを<WeatherForecast>であることを条件とします。

ItemsSource="{Binding}"は、ItemsSource="{Binding Path=.}"の略です。

しかし、どのようにDataTemplateのデータ型を定義できますか?

<DataTemplate x:DataType="local:WeatherForecast"> 

...ローカルはWeatherForecastクラスの名前空間の名前空間マッピングです:

コンパイルされていないバインディングは必要ありませんAltough

、あなたはこのようなDataTemplateのデータ型を指定することができます

<Page 
    x:Class="App1.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:App1" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d"> 

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <ListView x:Name="lv" ItemsSource="{Binding}"> 
      <ListView.ItemTemplate> 
       <DataTemplate x:DataType="local:WeatherForecast"> 
        <TextBlock Text="{Binding Name}" /> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </Grid> 
</Page> 

namespace App1 
{ 
    public class WeatherForecast 
    { 
     public string Name { get; set; } = "wf"; 
    } 
} 
+0

なので、問題はItemSourceバインディングでした。コードItemsSource = "{Binding}"はItemsSource = "{Binding Path =。}"が機能しないときに機能します。 – Christoph

関連する問題