2015-10-01 5 views
7

Учитывая это DataTemplate:Есть ли способ использовать типы значений в x: DataType?

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

Я получаю следующее сообщение об ошибке:

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

При следовании по ошибке, она принимает вас автоматически генерируемой код для этой точки зрения, которая использует оператор 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(); 
} 

Я знаю, что {x:Bind} является новым, но только в том случае, кто-нибудь знает, как настроить его, чтобы типы значений, или по крайней мере использовать прямой кастинг?

ответ

5

У меня такая же проблема при привязке типа Runtime Windows, как «Windows.UI.Color» в x: DateType.

Текущее обходное решение, которое я использовал, - это перенос .NET Reference Type.

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

Я надеялся, что мне не обязательно это делать, но я думаю, что это единственный способ. Спасибо Джеффри. – Laith

2

@ Решение JeffreyChen является абсолютно правильным и может применяться к любым другим типам значений. Но в этом конкретном случае ссылка, напечатанная SolidColorBrush, которая предоставляет свойство Color, является тем, что система уже построила для вас.

Я хотел бы предложить, чтобы изменить Color свойства в вашей виртуальной машине SolidColorBrush, потому что единственный раз, когда вам нужен будет в вашем XAML в Color, когда вы хотите гладкой ColorAnimation между двумя состояниями. Если это так, вы делаете -

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

В противном случае, вы просто привязать к управлению XAML-х Foreground/Background/BorderBrush который уже тип Brush.

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

В этом случае «SolidColorBrush» разрешает проблему. Однако я использую «Цвет» в качестве примера для типа значения. У меня может быть тип значения, поступающий из переносимой библиотеки, в которой живут виртуальные машины, или даже использовать примитивные типы, такие как 'int []' где ''. – Laith

Смежные вопросы