有什么办法可以在x:DataType中使用值类型吗?

时间:2015-10-01 05:38:05

标签: c# xaml windows-store-apps uwp

鉴于此DataTemplate

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

我收到以下错误:

  

as运算符必须与引用类型或可空类型一起使用(&#39; Color&#39;是非可空值类型)

当您按照错误操作时,会自动为使用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}是新的,但为了以防万一,是否有人知道如何配置它以允许值类型,或者至少使用直接投射?

2 个答案:

答案 0 :(得分:5)

在x:DateType中绑定Windows运行时类型(例如“Windows.UI.Color”)时遇到同样的问题。

我使用的当前解决方法是包装.NET引用类型。

n

答案 1 :(得分:2)

@ JeffreyChen的解决方案绝对正确,可以应用于任何其他值类型。但是在这个特定的实例中,引用SolidColorBrush的引用显示了Color的属性,这是系统已经为您构建的。

我建议将您的VM中的Color属性更改为SolidColorBrush,因为您在xaml中只需要Color的时间就是当您需要平滑时ColorAnimation 1}}两个州之间。如果是这种情况 -

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