2016-07-22 4 views
3

내 프로그램에서 hubsection을 사용 중이며 <HubSection>에 ListView가 있습니다. 그러나 나는 ListView에 데이터를 바인딩 할 수 없다. 나는 {binding}를 사용하여 시도했지만 내가UWP에서 x : bind를 통해 ListView에 데이터 바인딩

의 DataTemplate에 대해 정의 된 데이터 형식없는 오류가 발생하고있는 x:bind를 사용할 때 출력에 빈 받고 있어요. x : Bind를 포함하는 템플릿에는 'x : DataType'을 사용하여 지정할 데이터 유형이 필요합니다.

도와주세요.

.xaml

<Hub Header="abc" FontWeight="Bold"> 
     <HubSection Header="header1" x:Name="hub1"> 
      <DataTemplate > 
       <ListView x:Name="list1" ItemsSource="{x:Bind info}"> 
        <ListView.ItemTemplate> 
         <DataTemplate> 
          <StackPanel Orientation="Vertical"> 
           <StackPanel Orientation="Vertical"> 
            <StackPanel Orientation="Horizontal"> 
             <Image Source="{X:Bind image}"></Image> 
             <TextBlock Text="{x:Bind name}"/> 
            </StackPanel> 
            <TextBlock Text="{x:Bind bio}"/> 
           </StackPanel> 
          </StackPanel> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 
      </DataTemplate> 
     </HubSection> 
     <HubSection Header="header 2"> 
      <DataTemplate>   
      </DataTemplate> 
     </HubSection> 
    </Hub> 
</Grid> 

.cs

namespace app1 
{ 
public class info 
{ 
    public String name { get; set; } 
    public String bio { get; set; } 
    public String image { get; set; } 
} 

public sealed partial class abcde : Page 
{ 

    ObservableCollection<info> obsinfo = new ObservableCollection<info>(); 
    public abcde() 
    { 
     this.InitializeComponent(); 
     filldata(); 
    } 
    void filldata() 
    { 
     obsinfo.Add(new info { name = "data1", image = "images/data1.png", bio = "" }); 
     obsinfo.Add(new info { name = "data2", image = "images/data2.png", bio = "" }); 

    } 
} 
} 

답변

3

당신은 당신이 당신이 그것에 바인딩 할 어떤 데이터 형식을 어떤 정의되지 않은 사실을 말하고 얻을 기본적으로 오류 : 여기 내 코드입니다.

그래서 DataTemplate을에서이 문제를 해결하기 위해 당신이 속성을 추가에서 : ListView.ItemTemplate -> DataTemplate을

X :이 예제 클래스를 들면 : "DATA_TYPE 네임 스페이스"

를 데이터 형식 =

<DataTemplate x:DataType="local:info" 
: 정보는 XAML에 네임 스페이스에 대해 나는 다음과 같이 네임 스페이스에 대한 지역을 설정할 수 있도록 MainPage과 동일한 네임 스페이스에 있습니다

그리고이 부분에서 또한 당신이 만든 실수 :

ItemsSource = "{X : 바인딩 정보}"당신은 당신이 그것을 형성 바인딩 할 목록 또는 개체를 설정할 필요가 여기에

데이터 유형이 아니며 클래스 정보가 분명히 자신의 데이터 유형입니다.

다른 점은 HubControl의 ItemsSource를로드 이벤트로 프로그래밍 방식으로 설정해야하며로드 이벤트에서 ItemSource를 설정할 필요가 있다는 것입니다. 당신의 XAML은 다음과 같아야합니다 모든 수리와 경우에 따라서

,이 테스트를 모두 XAML 및 .CS에 대한 코드를 작동 :

<Hub Header="abc" FontWeight="Bold"> 
     <HubSection Header="header1" x:Name="hub1"> 
      <DataTemplate> 
       <!-- Instead of ItemSource in XAML we make event in which we will set ItemSource --> 
       <ListView x:Name="list1" 
          Loaded="Data_Loaded"> 
        <ListView.ItemTemplate> 
         <DataTemplate x:DataType="local:info"> 
          <StackPanel Orientation="Vertical"> 
           <StackPanel Orientation="Vertical"> 
            <StackPanel Orientation="Horizontal"> 
             <Image Source="{X:Bind image}"></Image> 
             <TextBlock Text="{x:Bind name}"/> 
            </StackPanel> 
            <TextBlock Text="{x:Bind bio}"/> 
           </StackPanel> 
          </StackPanel> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 
      </DataTemplate> 
     </HubSection> 
     <HubSection Header="header 2"> 
      <DataTemplate>   
      </DataTemplate> 
     </HubSection> 
    </Hub> 
</Grid> 

귀하의 .cs 부분 클래스 :

namespace app1 
{ 
public class info 
{ 
    public String name { get; set; } 
    public String bio { get; set; } 
    public String image { get; set; } 
} 

public sealed partial class abcde : Page 
{ 

    ObservableCollection<info> obsinfo = new ObservableCollection<info>(); 
    public abcde() 
    { 
     this.InitializeComponent(); 
     filldata(); 
    } 
    void filldata() 
    { 
     obsinfo.Add(new info { name = "data1", image = "images/data1.png", bio = "" }); 
     obsinfo.Add(new info { name = "data2", image = "images/data2.png", bio = "" }); 

    } 

    // Here we can set ItemsSource for our ListView 
    private void Data_Loaded(object sender, RoutedEventArgs e) { 
       var listView = (ListView)sender; 
       listView.ItemsSource = obsinfo; 
    } 

    } 
} 

변경 한 후에 변경하고 실행하십시오.

참고 : X의 : 데이터 형식 속성은 클래스 정보이 제대로 작동하기 위해 인 네임 스페이스를 설정주의해야합니다.

XAML에서 청색 선이 변경된 경우 프로젝트를 정리하고 다시 작성하고 코드 분리를 수행하는 것이 좋습니다.

또한 내 팁은 "데이터 표시"와 같은 종류의 피벗 컨트롤을 사용하는 것이므로 구현하기가 쉽고 비슷한 결과를 얻습니다. 당신은 here을 확인할 수 있습니다.

+0

thnku. 나는 모든 것이 적절하게 작동하도록 올바르게 만들 것이다. – Ravi

+0

최종 편집에 대한 나의 대답은 완전히 작동하는 코드이다. 응답에서 언급했듯이, 앱에서 허브를 사용할 필요가 없다면 피벗을 사용하여 데이터를 표시하고 허브를 통해 앱을 탐색 할 수 있습니다. MSDN에서 허브 및 피벗에 대한 공식 문서를 보는 것이 좋습니다. –

+0

'ItemsSource = "{x : Bind obsinfo}"도'Data_Loaded' 이벤트 대신에 작동합니까? –

관련 문제