2015-10-01 21 views
7

bu DataTemplate Verilen:x cinsinden değer türlerini kullanabileceğim bir yol var mı: DataType?

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

aşağıdaki hata alıyorum: Hatayı takip ettiğinizde

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

, bu as operatör kullanması görünüm için otomatik olarak üretilen kod götürür.

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(); 
} 

Ben {x:Bind} yeni olduğunu biliyorum, ama her ihtimale karşı, herkes değeri türlerini izin verecek şekilde yapılandırmanız veya en azından doğrudan dökümü nasıl kullanılacağını biliyor?

cevap

5

Windows Runtime Türünü x: DateType içinde “Windows.UI.Color” gibi bağlarken aynı sorunu yaşıyorum.

Kullandığım geçerli geçici çözüm, .NET Referans Türü'nü sarmaktır.

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

Bunu yapmak zorunda olmadığımı umuyordum, ama sanırım tek yol bu. Teşekkürler Jeffrey. – Laith

2

@ JeffreyChen'in çözümü kesinlikle doğrudur ve diğer tüm değer türlerine uygulanabilir. Ancak bu özel örnekte, Color özelliğine sahip olan SolidColorBrush numaralı bir başvuru, sistemin zaten sizin için oluşturduğu bir şeydir. Eğer düzgün ColorAnimation iki arasındaki durumlarını istediğinizde

Ben sadece zaman size xaml bir Color gerekir çünkü SolidColorBrush için VM Color özelliğini değiştirmek için öneririm

olduğunu. Bu yapmanız durumda -

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

Aksi takdirde, sadece bağlamak zaten Brush türüdür XAML kontrolü en Foreground/Background/BorderBrush.

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

Bu durumda, evet, "SolidColorBrush" sorunu çözüyor. Ancak, bir değer türü için bir örnek olarak 'Renk 'kullanıyorum. VM'lerin yaşadığı portatif bir kütüphaneden gelen bir değer tipine sahip olabilir, hatta 'int []' '' DataTemplate x: DataType = 'x: Int32'> 'gibi ilkel türler de kullanabilirim. – Laith

İlgili konular