4

我有一个具有以下三个属性的 viewModel:

string searchString;
ObservableCollection<Company> ListedItems;
ICommand SearchCommand;

它代表了我数据库中可搜索的公司列表。SearchCommand根据 的值搜索数据库searchString,然后填充ListedItems结果。

SearchString绑定到文本框,而SearchCommand绑定到按钮。我想让它在用户输入文本框时SearchCommand自动执行,而无需用户单击按钮。

目前,我通过我的 viewModel 执行此操作:

public ListViewModel() {
    this.PropertyChanged += delegate(object o, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "SearchString")
            SearchCommand.Execute(null);
    };
}

它是否正确?在视图中具有此功能会更好吗?如果是这样,那是如何实现的?

4

3 回答 3

3

我认为更合适的解决方案是从 ViewModel 上 SearchString 属性的设置器调用命令。

于 2012-05-02T11:58:34.357 回答
2

我个人会考虑使用 Expression Blend SDK InvokeCommandAction

我敲了一个有效的例子。这是视图:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" x:Class="WpfApplication1.MainWindow"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <TextBox Text="Hello World">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="TextChanged">
                        <i:InvokeCommandAction Command="{Binding DoItCommand}" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </TextBox>
            <Button x:Name="CommandButton" Command="{Binding DoItCommand}" Content="Click me" />
        </StackPanel>
    </Grid>
</Window>

还有一个非常简单的 ViewModel(使用 PRISM 的DelegateCommand):

 public class SomeViewModel
    {
        public SomeViewModel()
        {
            DoItCommand = new DelegateCommand(() => Debug.WriteLine("It Worked"));
        }

        public ICommand DoItCommand { get; private set; }
    }

简单连接 ViewModel 背后的代码:

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new SomeViewModel();
        }
    }

您也不需要 Expression Blend 来执行此操作 - SDK 可以免费下载和使用。

如果您不喜欢使用 Expression Blend SDK,MVVM Light提供了 EventToCommand,它与此类似。

当然,只有在仍有理由将按钮放置在适当位置(或者您希望利用命令的可执行逻辑)时,这样做才真正有意义,否则您可以在属性的 setter 中触发一些逻辑。

于 2012-05-02T12:05:27.833 回答
1

更好地将命令绑定到TextBox. 也许会有所帮助。

于 2012-05-02T11:59:02.727 回答