Win8 Metro Style App 开发笔记(1) GridView以及相关列表控件

刚接触Metro的时候,经常会用到绑定数据的列表,常用的有GridView,ListView,ListBox,ItemsControl

对于这2个,我觉得差别不大,用法都差不多,F12到定义会发现,他们都继承自ListViewBase,可能他们重写了一些方法。ListView我还没用过,所以没去研究。

除了这2个,我还想说另外一个,就是他们的基类,ItemsControl。

先说说我对GridView了解的一些知识和技巧(ListView类似,暂时我没发现什么区别)

GridView是可以被点击到的,有被选中的效果。这个,使用GridView无法去掉选中效果。(我曾经想去掉来着)

SelectionMode的属性是设置GridView点击之后,是否可以被选中。None的话,就只有点击效果,不会选中。可选的还有,Single单选,Multiple多选。

自带了滚动条,并且,如果使用了ScrollView包起来,会导致焦点内无法使用鼠标滚轮

ItemsControl

这个控件的每个Item都只是一个Grid(猜的),是没有点击效果的。

再说说,关于绑定数据的那些事:

正常的来说,使用设置ItemsSource,然后给设置一个ItemTemplate就可以完成数据绑定了。

当然,这其中,会有一些特殊的需求。

如:显示数据时,其中的某一个内容不同,某种情况下,要从数据源中取A属性,某种情况下取的是B属性。或者,页面的格局都不太一样,怎么办呢??

正常的做法是,使用Selector。

Win8原生就支持了Selector,不像其他的WP7等需要重写ContentControl实现。(其实差不多。。)

下面就是我自己写的一个Selector,如果Temperature1为空,就使用LiveTemplate,否则使用ForecastTemplate

View Code
    public class ForecastTemplateSelector : DataTemplateSelector
    {
        public DataTemplate LiveTemplate { get; set; }
        public DataTemplate ForecastTemplate { get; set; }

        protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
        {
            var forecast = item as ForecastDetail;
            if (forecast != null)
            {
                if (forecast.Temperature1 == null)
                {
                    return LiveTemplate;
                }
                return ForecastTemplate;
            }
            return base.SelectTemplateCore(item, container);
        }
    }

页面上这样写。

        <selector:ForecastTemplateSelector x:Key="ItemTemplateSelector">
            <selector:ForecastTemplateSelector.LiveTemplate>
                <DataTemplate>
                    <Grid Width="235" Height="497">
                    </Grid>
                </DataTemplate>
            </selector:ForecastTemplateSelector.LiveTemplate>
            <selector:ForecastTemplateSelector.ForecastTemplate>
                <DataTemplate>
                    <Grid Width="235" Height="497">
                    </Grid>
                </DataTemplate>
            </selector:ForecastTemplateSelector.ForecastTemplate>
        </selector:ForecastTemplateSelector>

最后,在GridView上ItemTemplateSelector="{StaticResource ItemTemplateSelector}"就可以了。

这样就可以实现,当数据不同时候,使用不同的模版了。

(未完待续)

原文地址:https://www.cnblogs.com/fycayy/p/2628785.html