试图理解UWP数据绑定

时间:2016-04-19 21:26:55

标签: c# xaml data-binding uwp win-universal-app

所以,我做了一个非常简单的尝试,尝试从我拥有的类的属性尝试数据绑定,但无论出于何种原因,代码实际上做了什么。它没有抛出任何错误,但有些东西一定不能正常工作。我目前正在测试它是否表现得像我想要的那样,在这种情况下,它会将矩形的不透明度设置为零。这是数据模板的xaml似乎无法正确响应:

        <HubSection x:Name="China" Width="440" Height="460" Background="#FF343434" Header="China" IsHeaderInteractive="True" Tapped="{x:Bind HubSectionTapped}" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="50,0,0,0">
            <DataTemplate x:DataType="data:MainPageView">
                <Grid Height="460" Width="410" VerticalAlignment="Bottom" x:Name="ChinaBackground">
                    <Image Source="Assets/chinaFlag.bmp" x:Name="ChinaFlag"/>
                    <Rectangle x:Name="ChinaSelected_Rect" Width="410" Height="30" VerticalAlignment="Bottom" Fill="BlueViolet" Opacity="{x:Bind Opacity1}"/>
                </Grid>
            </DataTemplate>
        </HubSection>

这里有代码:

    public MainPageView TheMainPageView;

    public MainPage()
    {

        this.InitializeComponent();
        timer = new DispatcherTimer();
        timer.Tick += Timer_DyanmicResize;
        timer.Tick += Timer_SelectionIndicator;
        timer.Start();

        TheMainPageView = new MainPageView ();
    }

最后,这里引用了MainPageView类:

public class MainPageView
{
    public int Opacity1 {get; set;}
    public int Opacity2 {get;set;}
    public int Opacity3 { get; set; }

    public MainPageView()
    {
        this.Opacity1 = 0;
        this.Opacity2 = 0;
        this.Opacity3 = 0;
    }
}

在XAML中我添加了xmlns:data =&#34;使用:TestApp.Models&#34; (models是MainPageView所在的文件夹)。正如我所说,它不会抛出错误,但它也没有做任何事情,所以我有点不知道从哪里开始解决这个问题,因为没有任何错误。追溯。提前感谢您提供的任何帮助

2 个答案:

答案 0 :(得分:2)

HubSection 使用DataTemplate定义该部分的内容,内容可以内联定义或绑定到数据源。在此DataTemplate中使用绑定时,我们需要设置DataContext HubSection属性来为DataTemplate提供数据源。

  

{x:Bind} 不使用 DataContext 作为默认来源,而是使用页面或用户控件本身。因此,它将查看页面或用户控件的代码隐藏属性,字段和方法。

在页面或用户控件中直接使用{x:Bind}时,这是正确的。在DataTemplate内,有一点不同。

  

DataTemplate (无论是用作项目模板,内容模板还是标题模板)中,路径的值不会被解释为页面的上下文,但是在模板化的数据对象的上下文中。因此,在编译时可以验证其绑定(以及为它们生成有效的代码), DataTemplate 需要使用 x:DataType 声明其数据对象的类型。

有关UWP中数据绑定的更多信息,请查看Data binding in depth

要解决您的问题,您只需在DataContext中设置HubSection,如下所示:

<HubSection x:Name="China" Width="440" Height="460" Background="#FF343434" Header="China" IsHeaderInteractive="True" Tapped="{x:Bind HubSectionTapped}" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="50,0,0,0" DataContext="{x:Bind TheMainPageView}">
    <DataTemplate x:DataType="data:MainPageView">
        <Grid Height="460" Width="410" VerticalAlignment="Bottom" x:Name="ChinaBackground">
            <Image Source="Assets/chinaFlag.bmp" x:Name="ChinaFlag"/>
            <Rectangle x:Name="ChinaSelected_Rect" Width="410" Height="30" VerticalAlignment="Bottom" Fill="BlueViolet" Opacity="{x:Bind Opacity1}"/>
        </Grid>
    </DataTemplate>
</HubSection>

{x:Bind}中使用HubSection时,它会将页面本身用作其数据源,因为HubSection直接位于页面中。因此它可以在代码隐藏中获得TheMainPageView字段。但对于{x:Bind}中的DataTemplate,它不能如此 它的数据源是模板化而不是页面的数据对象。因此,我们需要通过设置DataContext的{​​{1}}属性来提供此数据对象。

答案 1 :(得分:0)

检查输出窗口是否有错误,但我想你可能会在那里看到绑定错误。不透明度是双倍的,您使用的是int,因此会出现类型转换错误。