刚接触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
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}"就可以了。
这样就可以实现,当数据不同时候,使用不同的模版了。
(未完待续)