Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查看可见性转换器输出_C#_Wpf_Converter - Fatal编程技术网

C# 查看可见性转换器输出

C# 查看可见性转换器输出,c#,wpf,converter,C#,Wpf,Converter,我是WPF应用程序的新手,但这似乎是一个非常简单的问题,我被难倒了。我试图寻找答案,但我发现的大部分都是绑定错误,而这里的情况并非如此 本质上,我有一个WPF应用程序访问数据库,向用户显示项目。所述数据保存在视图的网格中,其可见性由实现OnPropertyChanged和标准BoolToVisibility转换器的布尔属性(RecordLoaded)确定 DataView.xaml: <Grid Visibility="{Binding RecordLoaded, Converter={

我是WPF应用程序的新手,但这似乎是一个非常简单的问题,我被难倒了。我试图寻找答案,但我发现的大部分都是绑定错误,而这里的情况并非如此

本质上,我有一个WPF应用程序访问数据库,向用户显示项目。所述数据保存在视图的网格中,其可见性由实现OnPropertyChanged和标准BoolToVisibility转换器的布尔属性(RecordLoaded)确定

DataView.xaml:

<Grid  Visibility="{Binding RecordLoaded, Converter={StaticResource BoolToVisibility}}">
从数据库获取所有数据后,在FillDetails末尾,RecordLoaded设置为true

问题是,我试图实现一点“闪烁”,通过打开和关闭网格的可见性来表示视图已更新,特别是在处理两个记录之间差异最小的数据时。但是,虽然我可以通过使用转换器将网格从初始可见性。隐藏状态移动到可见状态,并且转换器在整个过程中正常工作,返回正确的隐藏或可见状态,当布尔值设置为false和true时,从视觉方面看,绝对没有任何变化,甚至没有闪烁

我的第一个想法是,状态很快就变回了真,这是不可检测的,但我在FillDetails方法中添加了一个延迟,就在布尔值之前,没有任何乐趣


是否有人对可能出现的问题有任何建议,或者甚至可能有其他方式表示数据已更新(没有突出的消息或其他信息)?

UI线程中的所有事情都是同步发生的,因此UI没有机会更新。您可以将事件处理程序声明为异步,在任务中运行FillDetails并等待:

private async void DataSelectedRecord_OnRecordSelected(object sender, EventArgs e)
{
    RecordLoaded = false;
    await Task.Run(() => FillDetails());
    RecordLoaded = true;
}
但是请注意,当FillDetails访问UI元素或UI元素绑定到的数据时,可能需要在
Dispatcher.Invoke
BeginInvoke
调用中执行此操作


如果数据库API允许异步访问,您可能还可以将FillDetails声明为异步并等待异步API调用。这样您就不需要任务。运行:

private async void DataSelectedRecord_OnRecordSelected(object sender, EventArgs e)
{
    RecordLoaded = false;
    await FillDetails();
    RecordLoaded = true;
}

private async Task FillDetails()
{
    var queryResults = await someDbApiCallAsync();
    // do something with it
}

在UI线程中,所有事情都是同步发生的,因此UI没有机会进行更新。您可以将事件处理程序声明为异步,在任务中运行FillDetails并等待:

private async void DataSelectedRecord_OnRecordSelected(object sender, EventArgs e)
{
    RecordLoaded = false;
    await Task.Run(() => FillDetails());
    RecordLoaded = true;
}
但是请注意,当FillDetails访问UI元素或UI元素绑定到的数据时,可能需要在
Dispatcher.Invoke
BeginInvoke
调用中执行此操作


如果数据库API允许异步访问,您可能还可以将FillDetails声明为异步并等待异步API调用。这样您就不需要任务。运行:

private async void DataSelectedRecord_OnRecordSelected(object sender, EventArgs e)
{
    RecordLoaded = false;
    await FillDetails();
    RecordLoaded = true;
}

private async Task FillDetails()
{
    var queryResults = await someDbApiCallAsync();
    // do something with it
}

FillDetails
是否同步?用户界面可能只是挂起了
FillDetails
synchronous?用户界面可能刚刚尝试过这个,这个工作非常好!添加了10毫秒的延迟来填充细节,以使闪烁更加明显,但这正是我想要的。我会留下问题,让更多的答案先进来,但这是简单的,并做什么,它在锡上说,很可能会被接受的答案。非常感谢。刚刚试过这个,效果很好!添加了10毫秒的延迟来填充细节,以使闪烁更加明显,但这正是我想要的。我会留下问题,让更多的答案先进来,但这是简单的,并做什么,它在锡上说,很可能会被接受的答案。非常感谢。