Chr*_*Dog 3 .net data-binding wpf listview
我有一个绑定到对象列表的WPF列表视图.要显示的项目之一是计算属性(只读,返回字符串),需要花费很少的时间来计算.当窗口最初加载时(或任何时候使用Notify事件更新UI),UI将在发生此数据绑定时挂起.我想知道的是一个很好的机制来处理这个问题(理想情况下,我想做一些事情,就像用旋转器和文本"处理......"或类似的方式使屏幕变灰一样).
我想我可以通过捕获数据绑定事件的开始并触发一个故事(或类似的)并在数据绑定事件的结束被触发时停止故事来做到这一点,但我找不到那种性质的事件.
有没有推荐的机制来处理长数据绑定或做我正在寻找的事件,但我在错误的位置?任何帮助,将不胜感激.
编辑:我可以获取一个旋转图标(Cursor.Wait),同时数据来源和数据绑定(使用下面的解决方案的部分),但现在需要知道数据绑定何时完成.一旦控件放在屏幕上(直接发生),.Loaded事件似乎会触发,但是在更新数据时不会发生.似乎没有针对ListView的OnDataBoundCompleted类型事件,有关在数据绑定过程完成时如何通知的任何想法/想法?
编辑:现在看看TargetUpdated事件,但得到一些奇怪的结果.如果我在TargetUpdated的事件处理程序中放置一个消息框,则更新UI(ListView显示数据),然后显示消息框.如果我剪切了消息框并且只有一个变量设置(即IsBusyCursor = Cursors.Arrow),它会在ListView显示数据之前执行此操作.
**解决方案:**我最终创建了一个新的演示文稿对象并设置Cursor = Wait然后循环遍历我之前绑定到ListView的对象并从中创建演示文稿对象(这导致计算属性被执行)然后创建了演示文稿对象的列表,将它们绑定到ListView和stet Cursor = Arrow.失望的似乎没有DataBinding Completed类型事件(或者在数据绑定完成后触发更新UI的任何事件被触发),但此解决方案似乎有效.
我有类似的情况ChrisHDog.我正在使用MVVM,这就是我所做的:
首先,在我的ViewModel中,我建立一个名为IsBusy的Property:
public bool IsBusy
{
get { return _isBusy; }
set
{
_isBusy = value;
NotifyPropertyChanged("IsBusy");
}
}
Run Code Online (Sandbox Code Playgroud)
然后,当涉及加载实际数据时,我会触发异步事件.但就在我这样做之前,我将IsBusy属性设置为true.在我的XAML中,我将光标绑定到此:
<UserControl x:Class="UserControls.Views.AgentListView"
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"
xmlns:Converters="clr-namespace:UserControls.Utility.Converters"
xmlns:Controls="clr-namespace:UserControls.Controls"
xmlns:DependencyProperties="clr-namespace:UserControls.DependencyProperties"
Cursor="{Binding IsBusy, Converter={Converters:CursorExtensionConverter}}" >
Run Code Online (Sandbox Code Playgroud)
CursorExtensionConverter只是一个简单的IValueConverter,用于将布尔值转换为XAML可以理解的正确Cursor值:
namespace UserControls.Utility.Converters
{
public class CursorExtensionConverter : MarkupExtension, IValueConverter
{
private static CursorExtensionConverter instance = new CursorExtensionConverter();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null && ((bool) value))
return Cursors.Wait;
else
return Cursors.Arrow;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return instance;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当数据以异步方式获取时,我将其封送回UI线程,然后将IsBusy属性设置为false.然后光标恢复正常.
至于异步调用和封送回UI,我留给你查找,因为它是这个答案的不同部分.我使用Action委托并使用BeginInvoke将其称为异步,然后使用我在此处找到的技术编组回UI线程:http://www.wintellect.com/CS/blogs/jlikness/archive/2009/12/16 /dispatching-in-silverlight.aspx.
我希望有所帮助!