(在學習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;//使用
}