[英]WPF DataGrid disable cell edit based on value
我有一個WPF DataGrid
其中ObservableCollection<ZeroConnection>
名為ZeroTable
的ObservableCollection<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.