gpt4 book ai didi

WPF DataGrid Validation.HasError 始终为假 (MVVM)

转载 作者:行者123 更新时间:2023-12-04 22:34:16 29 4
gpt4 key购买 nike

如果 Datagrid/DataGridCells 中有 ValidationErrors,我在获取信息时会遇到一些麻烦。

我要做的是通过 禁用按钮命令 (CanExecute) 基于是否存在验证错误。因此,我将 DataGrid 的 Validation.HasError 绑定(bind)到按钮上的 CommandParameter。

验证通过 实现IDataErrorInfo 查看型号 并且工作得很好。任何包含错误值的 DataGridCell 都会获得一个红色边框和一个描述错误的工具提示。

我只是无法开始工作是绑定(bind)那个按钮的命令参数 到 DataGrid 上的 Validation.HasError。如果我调试这个问题,Validation.HasError 总是假的。为什么?我该如何解决?

我几乎尝试了在这里和网络上其他地方找到的所有“解决方案”。到目前为止没有任何效果。

我的 DataGrid XAML:

<DataGrid x:Uid="DataGrid_1"
Name="SomeDataGrid"
Grid.Column="0"
Grid.Row="1"
Grid.RowSpan="2"
ItemsSource="{Binding SomeItems}"
SelectedItem="{Binding SomeSelectedItem, Mode=TwoWay}"
CanUserSortColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
IsReadOnly="False"
IsSynchronizedWithCurrentItem="True"
IsTabStop="True"
IsTextSearchEnabled="True"
>
<DataGrid.Resources>
<SolidColorBrush x:Uid="SolidColorBrush_1"
x:Key="{x:Static SystemColors.ControlBrushKey}"
Color="{x:Static SystemColors.HighlightColor}" />
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn x:Uid="Comlumn1"
x:Name="Comlumn1"
Header="SomeHeader"
Width="auto">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate x:Uid="DataTemplate_1">
<ComboBox x:Uid="ComboBox_7"
ItemsSource="{Binding DataContext.Attributes,Source={StaticResource ProxyElement}}"
SelectedItem="{Binding Attribute, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
DisplayMemberPath="DESCRIPTION"
IsEditable="False"
IsTextSearchEnabled="False"
Margin="0"
Padding="0" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate x:Uid="DataTemplate_2">
<TextBlock x:Uid="TextBlock_15"
Text="{Binding Attribute, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
ToolTip="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

<DataGridTextColumn x:Uid="DataGridTextColumn_2"
Header="Value"
Width="auto"
Binding="{Binding VALUE, ValidatesOnDataErrors=True}">
<DataGridTextColumn.ElementStyle>
<Style x:Uid="Style_4"
TargetType="{x:Type TextBlock}">
<Setter x:Uid="Setter_4"
Property="DataGridCell.ToolTip"
Value="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn x:Uid="DataGridTextColumn_3"
Header="Unit"
Width="auto"
Binding="{Binding UNIT, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}"
IsReadOnly="True" />
<DataGridTextColumn x:Uid="DataGridTextColumn_4"
Header="Remark"
Width="auto"
Binding="{Binding REMARK}" />
</DataGrid.Columns>
</DataGrid>

我要绑定(bind)到 DataGrid Validation 的按钮。错误:

    <Button x:Uid="Button_1"
Content=" + "
Command="{Binding AddItemCommand}"
CommandParameter="{Binding (Validation.HasError), ElementName=SomeDataGrid}" />

最佳答案

好的,我终于解决了!以下方法来自 here确实有效,但只有 之后 包含我的 Datagrid 的窗口是 满载 (例如在 Window/Usercontrol Loaded EventHandler 中):

public bool IsValid(DependencyObject parent)
{
if (Validation.GetHasError(parent))
return false;

// Validate all the bindings on the children
for (int i = 0; i != VisualTreeHelper.GetChildrenCount(parent); ++i)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, i);
if (!IsValid(child)) { return false; }
}

return true;
}

关于WPF DataGrid Validation.HasError 始终为假 (MVVM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17951045/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com