簡體   English   中英

WPF DataGrid禁用基於值的單元格編輯

[英]WPF DataGrid disable cell edit based on value

我有一個WPF DataGrid其中ObservableCollection<ZeroConnection>名為ZeroTableObservableCollection<ZeroConnection> 如果ZeroTable.NetID == 0 ,則應禁用DataGrid行並且該行有效。 此外,如果ZeroTable.Number == "" ,則應禁止對該特定單元格進行編輯。 但是尚未成功實現此操作,因為用戶仍然可以編輯單元格。 我的XAML在下面;

<Window.Resources>
    <local2:RowReadOnlyConverter x:Key="RowReadOnlyConverter" />
    <local2:CellReadOnlyConverter x:Key="CellReadOnlyConverter" />
</Window.Resources>

<DataGrid Name="ZeroTableGridView" Grid.Column="0"  AlternatingRowBackground="#FFEEEEEE" AutoGenerateColumns="False" 
          ItemsSource="{Binding ZeroTable}"  CanUserAddRows="False"
          dd:DragDrop.IsDragSource="True" dd:DragDrop.IsDropTarget="True"  dd:DragDrop.DropTargetAdornerBrush="Coral" 
          dd:DragDrop.DropHandler="{Binding }">
    <DataGrid.Resources>
        <Style TargetType="{x:Type DataGridRow}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding NetID, Converter={StaticResource RowReadOnlyConverter}}" Value="True">
                    <Setter Property="IsEnabled" Value="False" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Nummer" Binding="{Binding Number}" CanUserSort="False" IsReadOnly="False">
            <DataGridTextColumn.ElementStyle>
                <Style TargetType="{x:Type TextBlock}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Number, Converter={StaticResource CellReadOnlyConverter}}" Value="True">
                            <Setter Property="IsEnabled" Value="False" />
                            <Setter Property="Background" Value="HotPink"/> <!-- For debugging -->
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGridTextColumn.ElementStyle>
        </DataGridTextColumn>
        <DataGridTextColumn Header="Ledning" Binding="{Binding Wire}" CanUserSort="False" IsReadOnly="False"/>
        <DataGridTextColumn Header="Postbeteckning" Binding="{Binding ItemDes}" CanUserSort="False" IsReadOnly="True"/>
        <DataGridTextColumn Header="Uttag" Binding="{Binding Terminal}" CanUserSort="False" IsReadOnly="True"/>
        <DataGridTextColumn Header="Hänvisning" Binding="{Binding Ref}" CanUserSort="False" IsReadOnly="True"/>
        <DataGridTextColumn Header="Kretsschema" Binding="{Binding Sheet}" CanUserSort="False" IsReadOnly="False"/>
        <DataGridTextColumn Header="Anmärkning" Binding="{Binding Remark}" CanUserSort="False" IsReadOnly="False"/>
        <!--<DataGridTextColumn Header="ID" Binding="{Binding NetID}" CanUserSort="False"/> -->
    </DataGrid.Columns>
</DataGrid>

以及下面的C#代碼;

public class CellReadOnlyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string number = (string)value;
        if (number == "")
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new Exception("The method or operation is not implemented.");
    }
}

public class RowReadOnlyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int netID = (int) value;
        if (netID == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new Exception("The method or operation is not implemented.");
    }
}

包含空字符串的單元格“數字”仍可編輯。 單元格的背景確實發生了變化,因此DataTrigger似乎已激活。 感謝幫助

您需要EditingElementStyle以將字段標記為啟用/禁用

下面的代碼顯示了如何做

<DataGridTextColumn Header="Nummer" Binding="{Binding Number}" CanUserSort="False" IsReadOnly="False">
    <DataGridTextColumn.EditingElementStyle>
        <Style TargetType="{x:Type TextBox}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Number}" Value="">
                    <Setter Property="IsEnabled" Value="False" />
                </DataTrigger>
                <DataTrigger Binding="{Binding Number}" Value="{x:Null}">
                    <Setter Property="IsEnabled" Value="False" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM