有時候DataGrid編輯的時候一個屬性需要根據別的屬性呈現不同的編輯狀態。這就需要一個做一個狀態切換。比如地址是1的時候,讀寫類型是讀寫、只讀、只寫。地址是2的時候,就只讀。狀態欄切換為TextBook不能修改。效果如下:


1.先需要在資源字典中定義2個模板:
<UserControl.Resources> <ResourceDictionary> <DataTemplate x:Key="TextBlockTemplate" DataType="viewModel:IoDataItemViewModel" > <TextBlock Text="{Binding ReadWriteTypeStr,UpdateSourceTrigger=PropertyChanged}" TextAlignment="Center" VerticalAlignment="Stretch" /> </DataTemplate> <DataTemplate x:Key="ComBoxTemplate" DataType="viewModel:IoDataItemViewModel"> <ComboBox Text="{Binding ReadWriteTypeStr, UpdateSourceTrigger=PropertyChanged}" Loaded="FrameworkElement_OnLoaded" ItemsSource="{x:Static viewModel:ReadWriteTypeView.ReadWriteTypes}" SelectedValuePath="Key" DisplayMemberPath="Value" BorderThickness="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"> </ComboBox> </DataTemplate> </ResourceDictionary> </UserControl.Resources>
2.定義模板選擇器
定義了一個TextBlock和Combox模板。在xaml中初始化。
public class IoItemReadWriteTypeGridCellTemplateSelector : DataTemplateSelector { public DataTemplate ComBoxTemplate { get; set; } public DataTemplate TextBlockTemplate { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { var ioitem = item as IoDataItemViewModel; if (ioitem == null) return base.SelectTemplate(item, container); var type = IOAddressHelper.GetReadWriteType(ioitem.IoDeviceViewModel.IoDevice.DriverName, ioitem.Address); if (type != ReadWriteType.ReadWrite) { return TextBlockTemplate; } return ComBoxTemplate; } }
3.在Grid Column定義中綁定對象。初始化TextBlockTemplate和 ComBoxTemplate, 這樣在觸發編輯狀態的時候,會根據地址的不同出現不同的編輯狀態
<syncfusion:GridTemplateColumn HeaderText="讀寫類型" MappingName="ReadWriteType" MinimumWidth="100" ColumnSizer="SizeToHeader" HorizontalHeaderContentAlignment="Center"> <syncfusion:GridTemplateColumn.CellTemplate> <DataTemplate DataType="viewModel:IoDataItemViewModel"> <TextBlock Text="{Binding ReadWriteTypeStr,UpdateSourceTrigger=LostFocus}" HorizontalAlignment="Center" VerticalAlignment="Center" /> </DataTemplate> </syncfusion:GridTemplateColumn.CellTemplate> <syncfusion:GridTemplateColumn.EditTemplate> <DataTemplate DataType="viewModel:IoDataItemViewModel"> <TextBlock Text="{Binding ReadWriteTypeStr,UpdateSourceTrigger=LostFocus}" /> </DataTemplate> </syncfusion:GridTemplateColumn.EditTemplate> <syncfusion:GridTemplateColumn.EditTemplateSelector> <local:IoItemReadWriteTypeGridCellTemplateSelector TextBlockTemplate="{StaticResource TextBlockTemplate}" ComBoxTemplate="{StaticResource ComBoxTemplate}"></local:IoItemReadWriteTypeGridCellTemplateSelector> </syncfusion:GridTemplateColumn.EditTemplateSelector> </syncfusion:GridTemplateColumn>
