2015-10-01 16 views
7

Dato questo DataTemplate:Esiste un modo per utilizzare i tipi di valore in x: DataType?

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

ottengo il seguente errore:

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

Quando si segue l'errore, che ti porta a codice generato automaticamente per quella vista che utilizza l'operatore 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(); 
} 

so che {x:Bind} è nuovo, ma solo nel caso, qualcuno sa come configurarlo per consentire i tipi di valore, o almeno utilizzare fusione diretta?

risposta

5

Ho lo stesso problema quando si associa il tipo di Windows Runtime come "Windows.UI.Color" in x: DateType.

L'attuale soluzione che ho utilizzato è il wrapping di un tipo di riferimento .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

Speravo di non doverlo fare, ma credo che sia l'unico modo. Grazie Jeffrey. – Laith

2

@ La soluzione di JeffreyChen è assolutamente corretta e può essere applicata a qualsiasi altro tipo di valore. Ma in questa particolare istanza, un riferimento digitato SolidColorBrush che espone una proprietà di Color è qualcosa che il sistema ha già creato per te.

Io suggerirei di cambiare la proprietà Color nel vostro VM per SolidColorBrush perché l'unica volta che si avrebbe bisogno di un Color in XAML è quando si vuole liscia ColorAnimation tra due stati. Se questo è il caso si fa -

<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> 

In caso contrario, è sufficiente legarsi al di Foreground/Background/BorderBrush controllo XAML, che è già un tipo di Brush.

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

In questo caso, si, 'SolidColorBrush' risolve il problema. Tuttavia, sto usando 'Color' come esempio per un tipo di valore. Potrei avere un tipo di valore proveniente da una libreria portatile in cui vivono le macchine virtuali, o anche usare tipi primitivi come 'int []' dove ''. – Laith

Problemi correlati