用户选择时更改数据模板

时间:2016-01-27 17:40:29

标签: windows-runtime winrt-xaml windows-10-universal windows-10-mobile

我有两个数据表。一个是默认值,另一个是用户选择此项目时的默认值。我需要给所选项目提供正常模板的双倍宽度和高度。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

您想要做的并不困难,但通过交换数据模板无法解决问题。相反,它是通过在XAML中使用Visual States来完成的。可视状态允许您创建多个视图"您的XAML(例如,选择时和未选中时的样子)以及在这些之间轻松切换。交换数据模板是一个大问题,Mostafa,并且可能导致您的UI闪烁,因为底层子系统必须重新渲染可视树的这么多部分。

如果您想了解有关视觉状态的更多信息,您可以阅读我在同一主题上撰写的博客文章。

  

http://blog.jerrynixon.com/2013/11/windows-81-how-to-use-visual-states-in.html

现在唯一的问题是弄清楚当选择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);
    }
}

我希望这会有所帮助。

祝你好运!