2017-08-17 50 views
1

這是我第一次構建UWP應用程序,並且我一般都是C#/ Windows的新手。我正嘗試在用戶界面中使用透視。我希望樞軸標題來自連接的usb設備的ObservableCollection,其類別爲Device_Info。每個USB設備都有一個名爲HardwareRevNumMajor的屬性,我希望將其顯示爲每個支點標題。我的XAML看起來像這樣:uwp xaml DataBinding ObservableCollection內部的嵌套屬性

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

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Pivot x:Name="pivot1" Title="Pivot" Opacity="0.99" ItemsSource="{Binding Devices}"> 
     <Pivot.HeaderTemplate> 
      <DataTemplate> 
       <TextBlock> 
        <TextBlock.Text> 
         <Binding Path="Device_Info.HardwareRevNumMajor"/> 
        </TextBlock.Text> 
       </TextBlock> 

       <!--<TextBlock Text="{Binding HardwareRevNumMajor}"> 
       </TextBlock>--> 
      </DataTemplate> 
     </Pivot.HeaderTemplate> 
     <Pivot.ItemTemplate> 
      <DataTemplate> 
       <ItemsControl ItemsSource="{Binding DeviceFiles}"> 
        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding numBlocks}"/> 
           <TextBlock Text="{Binding syncTime}"/> 
          </StackPanel> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 
      </DataTemplate> 
     </Pivot.ItemTemplate> 
    </Pivot> 
</Grid> 

只要一個Device_Info對象被添加到Devices的ObservableCollection我得到一個錯誤。 Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))。然後,如果我點擊我的MainPage.xaml中文件中的設計師,我看到:

TargetException: Object does not match target type. 
StackTrace: 
at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target) 
at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, 
BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture) 
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index) 
InnerException: None 

你可以從上面的XAML我已經嘗試了多種方式來顯示HarwareRevNumMajor屬性,住在一個Device_Info見由註釋掉的TextBlock代碼。

我的視圖模型是這樣的:

namespace usb_test 
{ 
    public class View_Model 
    { 
     public ObservableCollection<Device_Info> _devices; 
     public ObservableCollection<File_Info> _deviceFiles; 
     public CoreDispatcher _dispatcher; 
    public View_Model() { 
     _devices = new ObservableCollection<Device_Info>(); 
     _deviceFiles = new ObservableCollection<File_Info>(); 
    } 

    public ObservableCollection<Device_Info> Devices 
    { 
     get 
     { 
      return _devices; 
     } 
    } 

    public ObservableCollection<File_Info> DeviceFiles 
    { 
     get 
     { 
      return _deviceFiles; 
     } 
    } 

在我MainPage.xaml.cs中我有這樣的:

namespace usb_test 
{ 
    public sealed partial class MainPage : Page 
    { 
    Device_List devList = new Device_List(); 
    Device_Structure deviceStruct = new Device_Structure(); 
    View_Model viewModel = new View_Model(); 
    public MainPage() 
    { 
     this.InitializeComponent(); 
     viewModel._dispatcher = Dispatcher; 
     this.DataContext = viewModel; 
     devList.devices.CollectionChanged += this.OnCollectionChanged; 
     deviceStruct.deviceFiles.CollectionChanged += this.OnCollectionChanged; 
... 

這行代碼是用來添加一個設備到列表:

await viewModel._dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => { devList.devices.Add(devInfo); }); 

該行成功並將Dev_Info對象添加到設備observableCollection和shor在應用程序崩潰之後。

我敢肯定,當我嘗試在xaml中稍後顯示文件信息的東西時會出現更多錯誤,但是我真的很感謝只是讓pivot header正確顯示。就像我說的,我對這個很陌生,所以我假設存在一些問題,我會很感激任何建議/澄清什麼阻止了我無法顯示Dev_Info對象的屬性。

謝謝!

+0

'災難性故障'是xaml框架中相當普遍的錯誤。隔離各個組件以試圖找出失敗的原因。您能否將''成功綁定到可觀察集合之外的單個Device_Info?如果您註釋掉HeaderTemplate,上述xaml是否工作?如果你註釋掉ItemTemplate?都? –

回答

0

Devices您的項目是Device_Info類型。在您的DataTemplate中,您將文本屬性綁定到Device_Info.HardwareRevNumMajor。由於上下文是您的項目(Device_Info),因此您嘗試訪問屬性Device_Info。

如果你寫:

<TextBlock Text="{Binding HardwareRevNumMajor}" /> 

您嘗試訪問屬性HardwareRevNumMajor至極可能存在於DEVICE_INFO。

+0

感謝您的回覆。上面我指出我也試過這個:'<! - - >'那也沒用。還有其他建議嗎? – fgv

+0

你可以測試'Text =「{Binding}」'來檢查你的上下文是什麼。 –

0

感謝您的上述建議。我取得了一些進展。

我改寫了我的XAML這樣的:

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

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Pivot x:Name="pivot1" Title="Pivot" Opacity="0.99" ItemsSource="{x:Bind viewModel.Devices}"> 
     <Pivot.HeaderTemplate> 
      <DataTemplate x:DataType="local:Device_Info"> 
       <TextBlock Text="{x:Bind HardwareRevNumMajor}"></TextBlock> 
      </DataTemplate> 
     </Pivot.HeaderTemplate> 
     <Pivot.ItemTemplate> 
      <DataTemplate x:DataType="local:Device_Info"> 
       <ListView ItemsSource="{x:Bind devStruct.deviceFiles}" Grid.Row="1"> 
        <ListView.ItemTemplate> 
         <DataTemplate x:DataType="local:File_Info"> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Foreground="Red" Text="{x:Bind fileName}" HorizontalAlignment="Center" Margin="0,0,20,0"/> 
           <TextBlock Foreground="Red" Text="{x:Bind numBlocks}" HorizontalAlignment="Center" Margin="0,0,20,0"/> 
           <Button Content="Download File" Click="{x:Bind onDownloadClick}" HorizontalAlignment="Center" Margin="0,0,20,0"> 
           </Button> 
          </StackPanel> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 
      </DataTemplate> 
     </Pivot.ItemTemplate> 
    </Pivot> 
</Grid> 

你會發現,我從我以前的XAML代碼拿出

<Page.DataContext> 
    <local:View_Model/> 
</Page.DataContext> 

然後我在Pivot中使用了ItemsSource="{x:Bind viewModel.Devices}">viewModel在我的MainPage.xaml.cs中定義,並且是我在上面創建的View_Model類的一個實例。然後從那裏我添加DataTypeDataTemplate這是一個Device_Info然後我可以很容易地訪問Device_Info對象的屬性,在這種情況下HardwareRevNumMajor

PivotItemTemplate有點混亂。類Device_Info上有一個屬性,名爲devStruct,它是我創建的類(Device_Struct)。 Device_Struct的實例具有File_Info對象的ObservableCollection。所以這個集合告訴我們設備上的文件,它被稱爲deviceFiles。這是我想在數據透視項目中使用的集合。我不確定是否有一種方法可以在不插入到XAML的情況下做到這一點,但這是我發現的作品。有了這個,我現在可以顯示有關每個數據透視表項上的文件的信息。

我也從使用Binding切換到x:Binding。說實話,我不確定爲什麼這會有所幫助,但是當我使用Binding時,我得到了:Object reference not set to an instance of an object。如果任何人有更好的理解,我很樂意聽到它。再次感謝!