【问题标题】:DataGrid Textbox DataTrigger Condition Not Working As ExpectedDataGrid 文本框 DataTrigger 条件未按预期工作
【发布时间】:2021-04-27 20:29:40
【问题描述】:

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

  1. 无论数据来自数据源还是新添加的,都使目标文本框只读。在选择 DrawingType 属性期间,必须立即评估只读。我正在使用 DataTrigger,但如果可以使用其他方法,那也没关系。
  2. 使样式通用,因为我会将其应用于 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


【解决方案1】:

如果该行是新添加的,则添加另一个 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,您可以使用&lt;Style TargetType="TextBox" x:Key="MyKey"&gt; 之类的键在资源中定义样式和定义,以后可以将其应用于Textbox 之类

<TextBox Style={StaticResource MyKey} ..... />

【讨论】:

    猜你喜欢
    • 2017-02-13
    • 2021-12-13
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多