gpt4 book ai didi

c# - 第二次打开带有用户控件的窗口时忽略 INotifyDataErrorInfo

转载 作者:太空宇宙 更新时间:2023-11-03 13:11:42 24 4
gpt4 key购买 nike

我遇到了一个非常困惑的情况:

我打开了一个对话框,其中显示了一个带有 INotifyDataErrorInfo 的 View ,它立即返回一个错误(当文本字段不为空时),我看到了红色边框的错误通知:

开场#1:

First opening

我什么都不做,关闭窗口,然后再次点击打开按钮:

开场#2:

Second opening

什么鬼?我检查了错误标志,它已设置。当我删除文本并写回一些内容时,错误边框再次出现,因为错误条件检查 string 是否为空?错误:没有错误

这是一个小的复制案例:

编辑:我添加了 ViewModel,它在每个节目中创建,导致 INCP 更改事件

主窗口.xaml.cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;

namespace LayoutBreakerMinimal
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private void ButtonBase_OnClick( object sender, RoutedEventArgs e )
{
var w = new Window();
var v = Resources["OneInstanceView"] as View; // new View(); <-- would work
w.Content = v;
v.DataContext = new ViewModel();
w.ShowDialog();
}
}


public partial class View : UserControl
{
public View()
{
InitializeComponent();
}
}


public partial class ViewModel : INotifyDataErrorInfo, INotifyPropertyChanged
{
private string _myTextField;

public ViewModel()
{
MyTextField = "Error field";
}

public string MyTextField
{
get { return _myTextField; }
set
{
_myTextField = value;
OnPropertyChanged();
if ( ErrorsChanged != null ) ErrorsChanged( this, new DataErrorsChangedEventArgs( "MyTextField" ) );
}
}

public IEnumerable GetErrors( string propertyName )
{
yield return "Field is null";
}

public bool HasErrors
{
get { return MyTextField != ""; }
}

public event EventHandler< DataErrorsChangedEventArgs > ErrorsChanged;

protected virtual void OnPropertyChanged( [CallerMemberName] string propertyName = null )
{
var handler = PropertyChanged;
if ( handler != null ) handler( this, new PropertyChangedEventArgs( propertyName ) );
}

public event PropertyChangedEventHandler PropertyChanged;
}
}

主窗口.xaml

<Window x:Class="LayoutBreakerMinimal.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:layoutBreakerMinimal="clr-namespace:LayoutBreakerMinimal"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<layoutBreakerMinimal:View x:Key="OneInstanceView" />
</Window.Resources>
<Grid>

<Button Click="ButtonBase_OnClick" Margin="40">Open Dialog, then open it again</Button>

</Grid>
</Window>

查看.xaml

<UserControl x:Class="LayoutBreakerMinimal.View"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<StackPanel>
<TextBox Text="{Binding MyTextField, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True}" Height="30" Width="100"></TextBox>
<Label Content="{Binding HasErrors}" Height="30" Width="100"></Label>
</StackPanel>
</UserControl>

我不明白为什么边框会消失。

我发现:如果我每次都创建 View (而不是单个资源实例),那么红色边框每次都从一开始就可用。

我测试了将 INotifyDataErrorInfo 移动到一个单独的 ViewModel 中,每次新建时都会实例化 -> 运气不好。

编辑 2:我将 HasError 标签添加到 View 以指示它一直显示错误

最佳答案

解决方案:

添加 x:Shared="False" 如下所示:我已经测试了修复并且它按预期工作。

<Window.Resources>
<layoutBreakerMinimal:View x:Key="OneInstanceView" x:Shared="False" />
</Window.Resources>

x:Shared="False" 时,修改 WPF 资源检索行为,以便对属性资源的请求为每个请求创建一个新实例,而不是为所有请求共享同一个实例。

这是修改后的 MainWindow.xaml

<Window x:Class="LayoutBreakerMinimal.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:layoutBreakerMinimal="clr-namespace:LayoutBreakerMinimal"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<layoutBreakerMinimal:View x:Key="OneInstanceView" x:Shared="False" />
</Window.Resources>

<Grid>
<Button Click="ButtonBase_OnClick" Margin="40">Open Dialog, then open it again</Button>
</Grid>
</Window>

关于c# - 第二次打开带有用户控件的窗口时忽略 INotifyDataErrorInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28305797/

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