DataGrid 文本框 DataTrigger 条件未按预期工作
DataGrid Textbox DataTrigger Condition Not Working As Expected
我有一个 window 从数据源填充数据网格。我正在使用 DataGridTemplateColumn 并且有文本框。我想根据我的 DrawingType 属性 值将此文本框设置为只读。假设我有这个来自“X 线”列的可编辑文本框。这仅在 DrawingType 为“Line”时才可编辑。我的数据触发条件在 window 负载下工作正常。但是我对网格上添加的新项目有疑问。当我 select 来自 DrawingType 组合框的椭圆时,文本框“Line From X”应该是只读的。但是我仍然可以输入一些文本。但是当我离开焦点光标让我们说焦点到其他单元格时,现在是新添加的项目“X 线”变为只读的时候。请帮忙。这是我想要实现的目标。
- 使目标文本框只读,无论数据来自数据源还是新添加的。在 selection of 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>
截图:
如果该行是新添加的,请添加另一个 DataTrigger
。根据您发布的代码,IsManuallyAdded
属性 似乎表示在会话期间是否添加了新行。
<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>
或者您可以将其绑定到 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} ..... />
我有一个 window 从数据源填充数据网格。我正在使用 DataGridTemplateColumn 并且有文本框。我想根据我的 DrawingType 属性 值将此文本框设置为只读。假设我有这个来自“X 线”列的可编辑文本框。这仅在 DrawingType 为“Line”时才可编辑。我的数据触发条件在 window 负载下工作正常。但是我对网格上添加的新项目有疑问。当我 select 来自 DrawingType 组合框的椭圆时,文本框“Line From X”应该是只读的。但是我仍然可以输入一些文本。但是当我离开焦点光标让我们说焦点到其他单元格时,现在是新添加的项目“X 线”变为只读的时候。请帮忙。这是我想要实现的目标。
- 使目标文本框只读,无论数据来自数据源还是新添加的。在 selection of 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>
截图:
如果该行是新添加的,请添加另一个 DataTrigger
。根据您发布的代码,IsManuallyAdded
属性 似乎表示在会话期间是否添加了新行。
<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>
或者您可以将其绑定到 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} ..... />