最近我意识到MVVM模式对于Silverlight应用程序来说非常有用,并且研究如何将其应用到我的项目中.
BTW,如何使用Command连接文本框的textChanged事件? Button有Command属性,但TextBox没有commapd属性.
如果控件没有命令属性,那么如何组合ICommand和Control的事件?
我得到以下xaml代码
<UserControl.Resources> <vm:Customerviewmodel x:Key="customerVM"/> </UserControl.Resources> <Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding Path=Customers,Source={StaticResource customerVM},Mode=TwoWay}" > <StackPanel> <StackPanel Orientation="Horizontal" Width="300" HorizontalAlignment="Center"> <TextBox x:Name="tbName" Width="50" Margin="10"/> <Button Width="30" Margin="10" Content="Find" Command="{Binding Path=GetCustomersByNameCommand,Source={StaticResource customerVM}}" CommandParameter="{Binding Path=Text,ElementName=tbName}"/> </StackPanel> <sdk:DataGrid ItemsSource="{Binding Path=DataContext,ElementName=LayoutRoot}" AutoGenerateColumns="True" Width="300" Height="300"/> </StackPanel> </Grid>
我想要做的是,如果用户在文本框中输入一些文本,数据将显示在datagrid中,而不是使用按钮单击.
我知道内置自动完成框控件,但是,我想知道如何在没有Command属性(如textBox)的控件中调用viewmodel类中的Command属性.
谢谢
解决方法
这是最简单的方法.将您的文本框绑定到视图模型上的属性,如上所述.然后,只需添加一个代码隐藏(是的,我正在使用MVVM代码隐藏,这不是世界的尽头)事件到文本框.添加一个TextChanged事件,然后简单地刷新绑定.
总而言之,您将有一个这样的视图模型:
public class Myviewmodel { private string _myText; public string MyText { get { return _myText; } set { _myText = value; RaisePropertyChanged("MyText"); // this needs to be implemented // now do whatever grid refresh/etc } } }
在你的XAML,你会有这样的:
<TextBox Text="{Binding MyText,Mode=TwoWay}" TextChanged="TextBox_TextChanged"/>
最后,在代码背后,简单地做:
public void TextBox_TextChanged(object sender,TextChangedEventArgs e) { var binding = ((TextBox)sender).GetBindingExpression(TextBox.TextProperty); binding.UpdateSource(); }
这将导致您的属性在文本更改的任何时候更新.}