2017-08-29 101 views
0

這個主題在c#中似乎很容易,但我需要在C++/cx中處理它。我想用'CItem'的列表/矢量來填充listview。所以,我已經試過這樣:UWP - ListView綁定在C++/CX

XAML的MainPage:

<ListView x:Name="mainListView" HorizontalAlignment="Stretch" VerticalAlignment="Center" Margin="20,0,20,6" > 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <Grid Height="40" Margin="5"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto"></ColumnDefinition> 
         </Grid.ColumnDefinitions> 
         <Border Background ="Gray" Width="50" Height="50" > 
          <Image Source="{Binding Image}" Stretch="UniformToFill" ></Image> 
         </Border> 
         <StackPanel> 
          <TextBlock Text="{Binding Hostname}" TextWrapping="NoWrap"/> 
         </StackPanel> 

        </Grid> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 

MainPage類:

Windows::UI::Xaml::Interop::IBindableVector^ test; 
CItem^ item = ref new 
CItem("name", "Assets/ic_help"); 
test->Append(item); 
mainListView->ItemsSource = test; 

CItem.h:

#pragma once 

#include "pch.h" 


    ref class CItem sealed 
    { 

    private: 
     Platform::String^ name; 
     Platform::String^ image; 


    public: 

     CItem(Platform::String^ name, Platform::String^ image) : 
      name {name}, image {image} {} 

     property Platform::String^ Name 
     { 
      Platform::String^ get() { return this->name;} 
     } 

     property Platform::String^ Image 
     { 
      Platform::String^ get() { return this->image;} 
     } 


    }; 

我這段代碼的問題是我在IBindableVector上得到一個空指針^因爲我不知道如何初始化它。我試圖使用一個正常的字符串列表/矢量,但它不適用於C++。所以你對我有一個模板,或者我可以很容易地解決這個問題。我只是想要一個容器,我的自定義項目,每次我得到新的數據,我想再次設置ListView的ItemSource。我想使用 - > ItemSource進行綁定而不是ViewController模式的原因是,我希望稍後將listview傳遞給生成數據並更新列表的線程(就像我已經在C#中完成的那樣,它正在工作)。

回答

1

這段代碼的問題是我在IBindableVector上得到一個空指針^,因爲我不知道如何初始化它。

IBindableVector表示可綁定對象的可寫向量集合。你需要初始化IBindableVector作爲 vector collection,例如,初始化IBindableVector如下,你會發現綁定工作:

Windows::UI::Xaml::Interop::IBindableVector^ test; 
test=ref new Platform::Collections::Vector<CItem^>(); 

更多細節請參考XamlBind official sample

0

在你最初的實現需要將BindableAttribute添加到您的CItem類:

[Windows::UI::Xaml::Data::Bindable] 
public ref class CItem sealed 

Source

如果你這樣做,你的載體的類型沒有被

Windows::UI::Xaml::Interop::IBindableVector^ test; 

您可以簡單地使用一個

Platform::Collections::Vector<CItem^>^ test; 

至少這對我有效!