【发布时间】:2021-04-27 20:29:40
【问题描述】:
我有一个从数据源填充数据网格的窗口。我正在使用 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>
【问题讨论】:
-
这个答案能解决你的问题吗?
标签: c# wpf xaml mvvm datatrigger