找出文本框文本是否在mvvm模式中没有更改

时间:2014-06-05 05:35:20

标签: c# wpf mvvm

任何人都可以帮助我找出我的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,但那不是我想要的......

3 个答案:

答案 0 :(得分:0)

你必须举起像RaisePropertyChanged之类的活动

public String SearchText
   {
    get
    {
        return _searchString;
    }

    set
    {
        _searchString = value;
       RaisePropertyChanged("functionProvidersView");
    }
   }

答案 1 :(得分:0)

WPF方法

  • 在TextChanged事件
  • 上定义了一个故事板
  • 添加了一个布尔动画,其中两帧错误为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秒钟后停止输入