代码改变世界

WPF 编辑状态切换

  stoneniqiu  阅读(2786)  评论(0编辑  收藏  举报

    有时候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>
复制代码

 

 

    

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示