2015-10-01 14 views
7

Biorąc pod uwagę to DataTemplate:Czy jest jakiś sposób mogę użyć typów wartości w x: DataType?

<DataTemplate x:DataType="Color"> 
    ... 
</DataTemplate> 

pojawia się następujący błąd:

The as operator must be used with a reference type or nullable type ('Color' is a non-nullable value type)

Po wykonaniu błędu, to przejście do automatycznego wygenerowany kod dla tego widoku, który używa operatora as.

public void DataContextChangedHandler(global::Windows.UI.Xaml.FrameworkElement sender, global::Windows.UI.Xaml.DataContextChangedEventArgs args) 
{ 
     global::Windows.UI.Color data = args.NewValue as global::Windows.UI.Color; 
     if (args.NewValue != null && data == null) 
     { 
     throw new global::System.ArgumentException("Incorrect type passed into template. Based on the x:DataType global::Windows.UI.Color was expected."); 
     } 
     this.SetDataRoot(data); 
     this.Update(); 
} 

wiem, że {x:Bind} jest nowa, ale na wszelki wypadek, czy ktoś wie jak go skonfigurować, aby umożliwić typy wartości, lub przynajmniej używać bezpośredniego odlewania?

Odpowiedz

5

Mam taki sam problem podczas wiązania typu środowiska wykonawczego Windows, np. "Windows.UI.Color" w x: DateType.

Obecnie stosowane obejście polega na zawijaniu typu referencyjnego .NET.

public class BindModel 
{ 
    public Windows.UI.Color Color { get; set; } 
} 

<DataTemplate x:Key="test" x:DataType="local:BindModel"> 
    <TextBlock> 
     <TextBlock.Foreground> 
      <SolidColorBrush Color="{x:Bind Color}"></SolidColorBrush> 
     </TextBlock.Foreground> 
    </TextBlock> 
</DataTemplate> 
+0

Miałem nadzieję, że nie muszę tego robić, ale myślę, że to jedyny sposób. Dzięki Jeffrey. – Laith

2

@ Rozwiązanie JeffreyChen jest absolutnie poprawne i można je zastosować do dowolnych innych typów wartości. Ale w tym konkretnym przypadku odwołanie o typie SolidColorBrush, które ujawnia właściwość Color jest czymś, co system już dla Ciebie zbudował.

Sugeruję, aby zmienić właściwości w swojej VM Color do SolidColorBrush bo tylko razem będzie trzeba Color w swoim XAML jest, gdy chcesz gładka ColorAnimation między dwoma stanami. Jeśli jest to przypadek zrobić -

<ListView ItemsSource="{x:Bind Vm.Brushes}"> 
    <ListView.ItemTemplate> 
     <DataTemplate x:DataType="SolidColorBrush"> 
      <TextBlock Text="Test"> 
       <TextBlock.Foreground> 
        <SolidColorBrush Color="{x:Bind Color}" /> 
       </TextBlock.Foreground> 
      </TextBlock> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

W przeciwnym razie po prostu wiązać XAML kontrola na Foreground/Background/BorderBrush który jest już rodzajem Brush.

<ListView ItemsSource="{x:Bind Vm.Brushes}"> 
    <ListView.ItemTemplate> 
     <DataTemplate x:DataType="SolidColorBrush"> 
      <TextBlock Text="Test" Foreground="{x:Bind}" /> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 
+0

W tym przypadku tak, 'SolidColorBrush' rozwiązuje problem. Jednak używam 'Color' jako przykładu dla typu wartości. Mogę mieć typ wartości pochodzący z przenośnej biblioteki, w której znajdują się maszyny wirtualne, lub nawet używać typów pierwotnych takich jak 'int []', gdzie ''. – Laith

Powiązane problemy