(在学习Wpf的时候,做一个小例子,想在TextBox改变后,检验合法性,并弹出提示。在找了很多贴后,发现这个小例子,抄袭过来,仅供参考。
最后也找到了适合自己例子的办法:在出发TextChanged后,做出提示(提示可以根据要求来写),见最后。)
虽然说MVVM模式下不建议在Viewmodel层中操控View层中控件,但是在某些情况下,比如想要得到某个事件的参数,在Viewmodel层中不太方便实现,这时候就可以用下面的方法了。
在XAML中
1、引用组件并设置
xmlns:Interaction="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:Interactivity="http://schemas.microsoft.com/expression/2010/interactivity"
2、DataContext设置
xmlns:VM="clr-namespace:MVVM_.ViewModel"
<Window.DataContext>
<VM:MainWindowViewModel /> < /Window.DataContext>
3、事件触发,以窗口的大小改变事件为例 SizeChanged
<Interactivity:Interaction.Triggers>
<Interactivity:EventTrigger EventName="SizeChanged">
<Interaction:CallMethodAction TargetObject="{Binding}" MethodName="SizeChangedCommand"/>
</Interactivity:EventTrigger>
< /Interactivity:Interaction.Triggers>
在Viewmodel中
public class MainWindowViewModel
{public void SizeChangedCommand(object obj, SizeChangedEventArgs e){}}
最后找出一中合适我测试所需要的,具体如下:
1、xaml中添加引用:
xmlns:ie = "http://schemas.microsoft.com/expression/2010/interractivity"
2、TextBox 代码:
<TextBox Text="{Binding xxx,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> <ie:Interaction.Triggers> <ie:EventTrigger EventName="TextChanged"> <ie:InvokeCommandAction Command = "{Binding TextChangedCommand}" CommandParametes="xxxx" /> </ie:EventTrigger > </ie:Interaction.Triggers> </TextBox>
大致意思是用Action和Invoke之类的。
EventName="TextChanged" 是TextBox中的事件,可以更换成自己需要的事件。
3、在后定义委托...(请参照上一篇代码)
4、如果是传窗体(Window)或者按钮Button,用ElementName,如下:
xaml代码:
<Button x:Name="btnSendButInfo" Width="100" Command="{Binding BtnClickCommand}"
CommandParameter="{Binding ElementName=btnSendButInfo}" />
ViewModel:
private DelegateCommand<Button> BtnClickCommand; //申明委托
BtnClickCommand = new DelegateCommand<Button>(BtnClick); //实例化
private void BtnClick(Button btn)
{
string strBtnName = btn.Name;//使用
}