这是一个 WPF,.Net 4.8 应用程序。我有一个类似于 tabcontrol 的控件,其中有一个 ContentPresenter:
<ContentPresenter Content="{Binding SelectedTab.Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" />
如果您单击列表中的某个项目,内容将切换到另一个项目(SelectedTab),该项目位于依赖项属性中,如下所示:
public static readonly DependencyProperty TabsProperty = DependencyProperty.Register(nameof(Tabs), typeof(ObservableCollection<MyTab>), typeof(MyTabLikeControl), new PropertyMetadata(null));
MyTab 就是这样一个类:
[ContentProperty(nameof(Content))]
public class MyTab : DependencyObject
{
#region Title
public string Title
{
get => (string)GetValue(TitleProperty);
set => SetValue(TitleProperty, value);
}
public static readonly DependencyProperty TitleProperty =
DependencyProperty.Register(nameof(Title), typeof(string), typeof(MyTab), new PropertyMetadata(null));
#endregion Title
#region Content
public object Content
{
get => GetValue(ContentProperty);
set => SetValue(ContentProperty, value);
}
public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register(nameof(Content), typeof(FrameworkElement), typeof(MyTab), new PropertyMetadata(null));
#endregion Content
}
您使用如下控件:
<m:MyTabControl>
<m:MyTabControl.Tabs>
<m:MyTab Title="Tab A">
...XAML content...
</m:MyTab>
<m:MyTab Title="Tab B">
...XAML content...
</m:MyTab>
<m:MyTab Title="Tab C">
...XAML content...
</m:MyTab>
<m:MyTabControl.Tabs>
</m:MyTabControl>
故障与验证有关。当 SelectedTab 更改为 Tabs 集合中的其他项目之一时,Validation.Error 会触发(x 次),删除我们要离开的选项卡上的所有验证错误(使用 IDataErrorInfo)。这很糟糕,因为我正在使用 Validation.Error 事件来计算有错误的 UI 元素的数量并显示它,以便用户知道哪些选项卡包含验证错误。
一旦我重新选择原始选项卡(并且 ContentPresenter 显示它),Validation.Error 将再次触发(x 次),因此我可以再次获取错误计数。但是当然,另一个选项卡会丢失所有错误(事件触发)!
此外,在实际选择它们之前,没有其他选项卡永远不会获得错误计数(并且 ContentPresenter 会显示它们)。
所以这就像验证系统无法识别绑定错误的存在,因为那个 UI 在那一刻没有显示,即使 UI 仍然存在。未选择的选项卡的视觉状态永远不会丢失,因此它们不会被删除和重新创建或类似的东西(它们存储在上面显示的选项卡依赖属性中)。
有没有办法在我的 ContentPresenter 不显示未选择的选项卡时将它们保留在可视树中,并最初在可视树中创建它们?我希望它们都立即可用,以便所有选项卡都可以显示它们的错误计数,并且无论选择哪个选项卡都可以实时更新。
我尝试了一个名为 Gu.Wpf.ValidationScope 的第三方验证库,但它遇到了同样的问题。所以现在我手动使用 Validation.Errors 具有相同的效果。