gpt4 book ai didi

c# - DataGrid 文本框 DataTrigger 条件未按预期工作

转载 作者:行者123 更新时间:2023-12-03 10:31:03 25 4
gpt4 key购买 nike

我有一个从数据源填充数据网格的窗口。我正在使用 DataGridTemplateColumn 并且有文本框。我想根据我的 DrawingType 属性值将此文本框设为只读。假设我从“Line From X”列中有这个可编辑的文本框。仅当 DrawingType 为“Line”时才可编辑。我的数据触发条件在窗口加载时工作正常。但是,我对网格上添加的新项目有疑问。当我从 DrawingType 组合框中选择 Ellipse 时,文本框“Line From X”应该是只读的。但是我仍然可以输入一些文本。但是当我离开焦点光标让我们说焦点到其他单元格时,现在是新添加的项目“Line From X”变为只读的时候了。请帮忙。这就是我想要实现的目标。

  • 无论数据来自数据源还是新添加,都使目标文本框只读。在选择 DrawingType 属性期间必须立即评估只读。我正在使用 DataTrigger 但如果可以使用其他方法,那没关系。
  • 使样式通用,因为我会将其应用于 2 列或更多列。我将使用相同的数据触发器将其他列转换为 DataGridTemplateColumn 并添加文本框。

  • 这是我的代码和屏幕截图。
    XAML:
    <Grid>
    <Grid.RowDefinitions>
    <RowDefinition Height="*"></RowDefinition>
    <RowDefinition Height="35"></RowDefinition>
    </Grid.RowDefinitions>

    <DataGrid ItemsSource="{Binding DrawnObjects}" AutoGenerateColumns="False" Grid.Row="0" Margin="0,20" Name="dgBldgDrawings" CanUserAddRows="False" IsEnabled="{Binding IsManuallyAdded,Converter={StaticResource VisibilityConverter}}">
    <DataGrid.Columns>
    <DataGridComboBoxColumn ItemsSource="{x:Static ext:Extensions.GetEnumTypes}" SelectedItemBinding="{Binding DrawingType}" Width="85" Header="Drawing Type">
    <DataGridComboBoxColumn.CellStyle>
    <Style TargetType="DataGridCell">
    <Style.Triggers>
    <DataTrigger Binding="{Binding IsManuallyAdded}" Value="False">
    <Setter Property="IsEnabled" Value="False" />
    </DataTrigger>
    </Style.Triggers>
    </Style>
    </DataGridComboBoxColumn.CellStyle>
    </DataGridComboBoxColumn>
    <DataGridTextColumn Width="60" Header="X" Binding="{Binding Path=FootX}"/>
    <DataGridTextColumn Width="65" Header="Y" Binding="{Binding Path=FootY}"/>
    <DataGridTextColumn Width="65" Header="Width" Binding="{Binding Path=FootWidth}"/>
    <DataGridTextColumn Width="65" Header="Height" Binding="{Binding Path=FootHeight}"/>
    <DataGridTextColumn Width="65" Header="Text" Binding="{Binding Path=Text}"/>
    <DataGridTemplateColumn Width="80" Header="Line From X">
    <DataGridTemplateColumn.CellTemplate >
    <DataTemplate >
    <TextBox Text="{Binding LineFootX1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Height="16">
    <TextBox.Style>
    <Style TargetType="TextBox">
    <Style.Triggers>
    <DataTrigger Binding="{Binding Path=DrawingType,UpdateSourceTrigger=PropertyChanged}" Value="Line">
    <Setter Property="IsReadOnly" Value="False" />
    </DataTrigger>
    </Style.Triggers>
    </Style>
    </TextBox.Style>
    </TextBox>
    </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTextColumn Width="80" Header="Line From Y" Binding="{Binding Path=LineFootY1}"/>
    <DataGridTextColumn Width="70" Header="Line To X" Binding="{Binding Path=LineFootX2}"/>
    <DataGridTextColumn Width="70" Header="Line To Y" Binding="{Binding Path=LineFootY2}"/>
    </DataGrid.Columns>
    <DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
    <Setter Property="Visibility" Value="{Binding IsForManualDraw, Converter={StaticResource VisibilityConverter}}"/>
    </Style>
    </DataGrid.RowStyle>
    <DataGrid.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black"/>
    </DataGrid.Resources>
    </DataGrid>
    <Button Content="Add New Drawing" Width="150" Command="{Binding AddNewDrawingCommand}" Height="25" Grid.Row="1" Margin="0,0,250,0"/>
    <Button Content="Save" Width="75" Command="{Binding SaveDrawingChangesCommand}" Height="25" Grid.Row="1"/>

    </Grid>
    截图:
    Working on window load
    Not working. I'm still able to input text. It becomes read only when I leave the editing focus

    最佳答案

    添加另一个 DataTrigger如果该行是新添加的,则可以工作。根据您发布的代码,IsManuallyAdded属性表示是否在 session 期间添加了新行。

    <Style TargetType="TextBox">
    <Setter Property="IsReadOnly" Value="False" />
    <Style.Triggers>
    <DataTrigger Binding="{Binding Path=DrawingType,UpdateSourceTrigger=PropertyChanged}" Value="Line">
    <Setter Property="IsReadOnly" Value="False" />
    </DataTrigger>
    <DataTrigger Binding="{Binding IsManuallyAdded}" Value="True">
    <Setter Property="IsReadOnly" Value="True" />
    </DataTrigger>
    </Style.Triggers>
    </Style>
    或者你可以绑定(bind)到 IsManuallyAdded如下所示:
    <Style TargetType="TextBox">
    <Setter Property="IsReadOnly" Value="{Binding IsManuallyAdded}" />
    <Style.Triggers>
    <DataTrigger Binding="{Binding Path=DrawingType,UpdateSourceTrigger=PropertyChanged}" Value="Line">
    <Setter Property="IsReadOnly" Value="False" />
    </DataTrigger>
    </Style.Triggers>
    </Style>
    对于#2,您可以使用 <Style TargetType="TextBox" x:Key="MyKey"> 之类的键在资源中定义样式和定义以后可以在 Textbox 上应用它像
    <TextBox Style={StaticResource MyKey} ..... />

    关于c# - DataGrid 文本框 DataTrigger 条件未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65860975/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com