0

这是一个 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 具有相同的效果。

4

1 回答 1

0

我放弃了尝试让它与我的自定义控件一起使用。相反,我发现重新设置 TabControl 和 TabItem 的样式是最容易的,它们没有这个问题,因为它们的行为类似于 ItemsControl。TabControl 无论如何都有很多有用的键盘行为。

于 2020-01-14T14:19:33.773 回答