任何人都可以帮助我找出我的TextBox文本是否在mvvm模式中没有改变一秒钟(使用wpf)。
在我的ViewModel中,我有一个属性
public String SearchText
{
get
{
return _searchString;
}
set
{
_searchString = value;
_functionProvidersView.Refresh();
}
}
其中_functionProvidersView
属于ObservableCollection<FunctionProviderViewModel>
类型。我希望只有当文本没有改变一秒钟时才会发生刷新。
我试图用System.Threading
来解决这个问题,但是没有做到这一点,有没有人有一个简单的解决方案?
编辑:根据SearchText
我的收藏集进行过滤。并且因为我的Filter机制需要一些时间,所以我希望只有当用户没有更改Textbox文本(没有输入任何内容)一秒钟时才会进行过滤。
TextBox属性UpdateSourceTrigger
设置为PropertyChanged
。我可以将其设置为LostFocus
,但那不是我想要的......
答案 0 :(得分:0)
你必须举起像RaisePropertyChanged
之类的活动
public String SearchText
{
get
{
return _searchString;
}
set
{
_searchString = value;
RaisePropertyChanged("functionProvidersView");
}
}
答案 1 :(得分:0)
WPF方法
添加了一个布尔动画,其中两帧错误为0,真实时间为1秒(您可以根据需要自定义,也可以绑定到设置)
<TextBox>
<TextBox.Triggers>
<EventTrigger RoutedEvent="TextBox.TextChanged" >
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="DataContext.TextChanged" >
<DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="False" />
<DiscreteBooleanKeyFrame KeyTime="0:0:1" Value="True"/>
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</TextBox.Triggers>
</TextBox>
这将在文本更改时触发属性更改,并在1秒后将值发送为true
视图模型的代码
在OnChanged处理程序中,我将执行刷新等逻辑
public bool TextChanged
{
get { return (bool)GetValue(TextChangedProperty); }
set { SetValue(TextChangedProperty, value); }
}
// Using a DependencyProperty as the backing store for TextChanged. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TextChangedProperty =
DependencyProperty.Register("TextChanged", typeof(bool), typeof(ViewModel), new PropertyMetadata(false,OnTextChanged));
private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if ((bool)e.NewValue)
{
//your logic after 1 second
(d as ViewModel)._functionProvidersView.Refresh();
}
}
在这种方法中,您不必手动管理计时器,它将由wpf处理
答案 2 :(得分:0)
一种方法是使用timer来延迟刷新调用:
public class MainVm
{
System.Threading.Timer timer;
private string searchText = string.Empty;
public string SearchText
{
get { return searchText; }
set
{
searchText = value;
timer.Change(1000, System.Threading.Timeout.Infinite); //reset the timer
}
}
public MainVm()
{
timer = new System.Threading.Timer(RefreshView,
null,
System.Threading.Timeout.Infinite,
System.Threading.Timeout.Infinite);
}
private void RefreshView(object state)
{
//Here you need to use the dispatcher because the callback is called
//from a non-UI thread
Application.Current.Dispatcher.Invoke(new Action(() =>
_functionProvidersView.Refresh()
);
}
}
这样,{1}}方法将在1秒钟后停止输入