轉帖|其它|編輯:郝浩|2011-04-20 10:25:14.000|閱讀 1685 次
概述:本文講述了如何去使用StyleSelector,讓Telerik的Grid根據業務邏輯呈現樣式。本文只是講解如何去用,對于原理性的東西說的比較少,希望讀者自己去鉆研和學習。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
需求:
客戶的希望數據發生改變后,用不同的顏色標記出來,同時希望在搜索的時候,將匹配的結果高亮顯示。
分析:
第一反應就是使用事件來處理這些功能。于是翻開文檔,開始查看Grid的各種事件。無意中看到很多XXXStyle. 我想也許我們可以通過設置樣式來改變顯示效果吧。但是我們需要根據數據來呈現不同的外觀,如果設置Style那么所有數據都是一樣的顏色。這種方案好像不可行,但每個XXXStyle屬性都會有一個XXXStyleSelector屬性,這個是用來干啥?馬上Google。
StyleSelector介紹:
提供根據自定義邏輯應用樣式的方法。用Reflector得到RowStyle的定義:
1 public class StyleSelector
2 {
3 public StyleSelector();
4 public virtual Style SelectStyle(object item, DependencyObject container);
5 }
具體實現:
1. 用不同的顏色標記發生改變的數據行
a) 只需要重載SelectStyle, 然后根據數據返回不同的Style,就能讓不同的數據呈現不同的UI。
1 public class FarmerItemStyleSelector : StyleSelector
2 {
3 public override Style SelectStyle(object item, DependencyObject container)
4 {
5 var farmer = item as IFarmer;
6 if (null == farmer)
7 return this.NormalStyle;
8
9 if (farmer.IsChanged)
10 return this.ChangedStyle;
11 return this.NormalStyle;
12 }
13
14 public Style NormalStyle { get; set; }
15 public Style ChangedStyle { get; set; }
16 }
b) 頁面的Resources中定義StyleSelector,并設置好樣式屬性。
<Page.Resources>
<Landscape:FarmerItemStyleSelector x:Key="rowStyleSelector" >
<Landscape:FarmerItemStyleSelector.ChangedStyle>
<Style TargetType="telerik:GridViewRow">
<Setter Property="Background" Value="LightGreen" />
</Style>
</Landscape:FarmerItemStyleSelector.ChangedStyle>
</Landscape:FarmerItemStyleSelector>
</Page.Resources>
c) 綁定Grid的RowStyleSelector屬性:
<telerik:RadGridView Name="MainGrid" RowStyleSelector=
"{StaticResource rowStyleSelector}"
ItemsSource="{Binding ElementName=GridDataFilter, Path=FilteredSource}"
2. 高亮顯示搜索匹配的結果
a) 首先定義好StyleSelector,將匹配成功的Cell用不同的樣式標記。
1 public class SearchedCellStyleSelector : StyleSelector
2 {
3 public override Style SelectStyle(object item, DependencyObject container)
4 {
5 if (string.IsNullOrEmpty(this.SearchText))
6 {
7 return null;
8 }
9 var cell = container as GridViewCell;
10 if (cell == null)
11 {
12 return null;
13 }
14
15 if (cell.Value != null && cell.Value.ToString().IndexOf(this.SearchText) > -1)
16 {
17 return HighlightedStyle;
18 }
19 return null;
20 }
21
22 public Style HighlightedStyle { get; set; }
23
24 public string SearchText { get; set; }
25 }
b) 頁面的Resources中定義StyleSelector,并設置好樣式屬性
<Landscape:SearchedCellStyleSelector x:Key="cellStyleSelector">
<Landscape:SearchedCellStyleSelector.HighlightedStyle>
<Style TargetType="telerik:GridViewCell">
<Setter Property="Background" Value="Orange" />
<Setter Property="Foreground" Value="White" />
</Style>
</Landscape:SearchedCellStyleSelector.HighlightedStyle>
</Landscape:SearchedCellStyleSelector>
c) 將定義好的StyleSelector綁定到GridColumn 的CellStyleSelector屬性
<telerik:GridViewDataColumn UniqueName="CompanyColumn"
Header="Company" CellStyleSelector="{StaticResource cellStyleSelector}" />
d) 將被搜索的文本傳遞給StyleSelector:
this.QuickSearchTextBox.TextChanged += (s, e) =>
{
var styleSelector =
this.Resources["cellStyleSelector"] as SearchedCellStyleSelector;
styleSelector.SearchText = this.QuickSearchTextBox.Text;
};
這一步本來是想通過綁定來完成,這樣更優雅,不用在后臺編寫代碼,更加符合MVVM的風格。但是綁定始終報錯,未能解決這個問題。
3. 最終效果圖:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:Coolite的博客