Windows runtime 当用户选择数据模板时更改它

Windows runtime 当用户选择数据模板时更改它,windows-runtime,winrt-xaml,windows-10-universal,windows-10-mobile,Windows Runtime,Winrt Xaml,Windows 10 Universal,Windows 10 Mobile,我有两个数据模板。一个是默认值,另一个用于用户选择此项目时。我需要给选定的项目两倍的宽度和高度的正常模板。我如何才能做到这一点?您想做什么并不困难,但交换数据模板并不能解决这一问题。相反,它是通过在XAML中使用可视状态来实现的。可视状态允许您创建XAML的多个“视图”(例如,选择和未选择时的外观),并可以轻松地在这些视图之间切换。交换数据模板是一件大事,Mostafa,并且可能会导致UI闪烁,因为底层子系统必须重新呈现可视化树的许多部分 如果你想了解更多关于视觉状态的信息,你可以阅读我写的关于

我有两个数据模板。一个是默认值,另一个用于用户选择此项目时。我需要给选定的项目两倍的宽度和高度的正常模板。我如何才能做到这一点?

您想做什么并不困难,但交换数据模板并不能解决这一问题。相反,它是通过在XAML中使用可视状态来实现的。可视状态允许您创建XAML的多个“视图”(例如,选择和未选择时的外观),并可以轻松地在这些视图之间切换。交换数据模板是一件大事,Mostafa,并且可能会导致UI闪烁,因为底层子系统必须重新呈现可视化树的许多部分

如果你想了解更多关于视觉状态的信息,你可以阅读我写的关于同一主题的博客文章

现在唯一的问题是,当gridview或listview中的项被选中时,如何触发可视状态。首先,您应该知道IsSelected是gridviewitem或listviewitem控件上容纳您的项的属性。但是,访问该属性很困难,最常见的方法是对gridview/listview进行子类化,覆盖PrepareContainerForItemOverride,并在代码中设置绑定

像这样:

class MyModel
{
    public bool IsSelected { get; set; }
}

class MyList : Windows.UI.Xaml.Controls.ListView
{
    protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        var model = item as MyModel;
        var listViewItem = element as Windows.UI.Xaml.Controls.ListViewItem;

        var binding = new Windows.UI.Xaml.Data.Binding
        {
            Source = model,
            Mode = Windows.UI.Xaml.Data.BindingMode.TwoWay,
            Path = new PropertyPath(nameof(model.IsSelected)),
        };
        listViewItem.SetBinding(Windows.UI.Xaml.Controls.ListViewItem.IsSelectedProperty, binding);
        base.PrepareContainerForItemOverride(element, item);
    }
}
我希望这有帮助

祝你好运