最近,在WPF方面的UI設計,設計很多控件的綁定和布局,因為剛開始學習,所以,有很多東西不是很懂,一邊在網上搜,一邊試着做,因為設計到在GridView中綁定控件,所有,在網上搜了搜,看了一篇很好的帖子,自己學着做了做,現在就總結一個WPF中如何在GridView中列中綁定其他的控件。為了增加效果,在WPF項目中用到了一個第三方的控件telerik,后面附加上相關的dll引用,在WPF項目中自己添加到自己的項目中就可以使用了。
首先,貼出我綁定后的GirdView的效果圖:
由於采用了telerik:StyleManager.Theme="Windows7"風格,所有可能看起來不是很像GridView,下面就給出xaml代碼:
<telerik:RadGridView ShowGroupPanel="False" AutoGenerateColumns="False" x:Name="grd1" ItemsSource="{Binding Path=LstData, Mode=TwoWay}" SelectionMode="Extended" RowHeight="50" telerik:StyleManager.Theme="Windows7"> <telerik:RadGridView.Columns> <telerik:GridViewSelectColumn /> <telerik:GridViewColumn Header="層次"> <telerik:GridViewColumn.CellTemplate> <DataTemplate> <TextBlock x:Name="txtName" Text="{Binding Level,Mode=TwoWay}" VerticalAlignment="Center" Height="22"></TextBlock> </DataTemplate> </telerik:GridViewColumn.CellTemplate> </telerik:GridViewColumn> <telerik:GridViewColumn Header="厚度" Width="80"> <telerik:GridViewColumn.CellTemplate> <DataTemplate> <TextBox x:Name="txtAge" VerticalAlignment="Center" Height="22"></TextBox> </DataTemplate> </telerik:GridViewColumn.CellTemplate> </telerik:GridViewColumn> <telerik:GridViewColumn Header="顏色" Width="120"> <telerik:GridViewColumn.CellTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <telerik:RadComboBox Margin="5,0,0,0" Width="60" Height="20" ItemsSource="{Binding BaseColor}" VerticalAlignment="Center" x:Name="btnSub"> </telerik:RadComboBox> <telerik:RadColorPicker></telerik:RadColorPicker> </StackPanel> </DataTemplate> </telerik:GridViewColumn.CellTemplate> </telerik:GridViewColumn> <telerik:GridViewColumn Header="結構" Width="95"> <telerik:GridViewColumn.CellTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <telerik:RadComboBox Margin="5,0,0,0" Width="60" Height="20" ItemsSource="{Binding Structure}" VerticalAlignment="Center" x:Name="btnSub"> </telerik:RadComboBox> </StackPanel> </DataTemplate> </telerik:GridViewColumn.CellTemplate> </telerik:GridViewColumn> </telerik:RadGridView.Columns> </telerik:RadGridView>
上面要添加telerik的引用 :xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
這樣,就可以在GridView的每一個列上加上想要的控件了,下面是后台的代碼,由於是第一個版本,所有代碼很多都沒有完善,但是,基本的界面顯示功能已經可以實現:
private string[] _StructureData = { "致密", "較致密", "疏松", "較疏松", "性脆易碎", "其他" }; private string[] _BaseColorData = { "亮黑色", "褐黑色", "黑色", "褐色", "其他" }; LevelCollection pc = new LevelCollection(); public CobaltRichCrustUIGroupBoxLevel() { InitializeComponent(); } private void UserControl_Loaded(object sender, RoutedEventArgs e) { pc.LstData.Add(new LevelInfo() { Level = "I", Structure = _StructureData.ToList(), BaseColor = _BaseColorData.ToList() }); pc.LstData.Add(new LevelInfo() { Level = "II", Structure = _StructureData.ToList(), BaseColor = _BaseColorData.ToList() }); pc.LstData.Add(new LevelInfo() { Level = "III", Structure = _StructureData.ToList(), BaseColor = _BaseColorData.ToList() }); pc.LstData.Add(new LevelInfo() { Level = "IV", Structure = _StructureData.ToList(), BaseColor = _BaseColorData.ToList() }); pc.LstData.Add(new LevelInfo() { Level = "V", Structure = _StructureData.ToList(), BaseColor = _BaseColorData.ToList() }); pc.LstData.Add(new LevelInfo() { Level = "VI", Structure = _StructureData.ToList(), BaseColor = _BaseColorData.ToList() }); this.DataContext = pc; } private void btnAdd_Click(object sender, RoutedEventArgs e) { } private void btnSub_Click(object sender, RoutedEventArgs e) { } } public class LevelCollection { private ObservableCollection<LevelInfo> lstData = new ObservableCollection<LevelInfo>(); public ObservableCollection<LevelInfo> LstData { get { return lstData; } set { lstData = value; } } } public class LevelInfo : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private string _Level = ""; private List<string> _Structure = new List<string>(); private List<string> _BaseColor = new List<string>(); public List<string> BaseColor { get { return _BaseColor; } set { _BaseColor = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("BaseColor")); } } } public List<string> Structure { get { return _Structure; } set { _Structure = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("Structure")); } } } public string Level { get { return _Level; } set { _Level = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("Level")); } } } }
上面的代碼很多都是Copy網上的程序,只是經過稍微修改可以使用了,具體的很多命名都沒有進行規范,后期版本在處理數據時,會進行命名規范。
Telerik相關的dll文件:Telerik.rar