我想在更新很多不同的文本框之后运行一个函数,是否可以在更新事件而不是特定事件之后监听一般的通用?
所以,而不是100个单独的函数调用,只有一个监听器?
编辑:看起来我们正在使用MVVM和传统代码的组合。
以下是其中一个文本框:
<TextBox Text="{Binding APhaseFrom}" x:Name="txtFromWhereA" TabIndex="26" HorizontalContentAlignment="Center" HorizontalAlignment="Left" Height="48" TextWrapping="NoWrap" VerticalAlignment="Top" Width="261" FontSize="26" FontWeight="Bold" BorderBrush="Black" BorderThickness="1" Margin="289,656,0,0" GotMouseCapture="txtFromWhereA_GotMouseCapture" GotFocus="txtFromWhereA_GotFocus" Grid.Row="3" />
视图模型中的代码:
public string APhaseFrom
{
get { return new string((char[])_f.Rows[1].GetValue("Alpha09")); }
set
{
if (value.Length <= 35)
{
_f.Rows[1].SetValue("Alpha09", value);
}
else
{
MessageBox.Show("Error: String length Longer than 35 Characters.");
}
}
}
我们也在为其他进程使用一些命令:
public ICommand Updatesql
{
get;
internal set;
}
private void CreateUpdatesql()
{
Updatesql = new RelayCommand(UpdatesqlExecute);
}
private void UpdatesqlExecute()
{
_f.Update();
}
我应该使用命令还是仅将事件链接到viewmodel中的函数?
答案 0 :(得分:1)
我删除了之前的想法,因为我现在更清楚地了解你在寻找什么。
但你肯定需要使用LostFocus
事件。
<TextBox Text="{Binding APhaseFrom}" x:Name="txtFromWhereA" LostFocus="OnLostFocus" />
答案 1 :(得分:1)
真的,你应该使用单一的设计模式......即MVVM在编写WPF应用程序时,每个文本框都绑定到一个实现INotifyPropertyChange接口的属性。
在每个属性的setter中,您实际上将更新值,触发属性更改事件,然后调用您的方法,或者只是在PropertyChanged事件的视图模型上添加事件处理程序。
另外...... MessageBox.Show在你的视图模型中是个坏主意,很难对它进行单元测试。
答案 2 :(得分:1)
由于您正在使用WPF,并且如果我正确理解您的问题,那么WPF使用的RoutedEvents可能会对您有所帮助。从本质上讲,像TextBox的LostFocus
事件这样的事件会冒泡您的UI层次结构,并且可以由公共父控件处理。考虑一下XAML和代码隐藏的片段:
<StackPanel TextBox.LostFocus="TextBoxLostFocus">
<TextBox></TextBox>
<TextBox></TextBox>
<TextBox></TextBox>
</StackPanel>
Codebehind:
private void TextBoxLostFocus(object sender, RoutedEventArgs e)
{
MessageBox.Show("Lost Focus!");
}
当焦点丢失时,您会发现为三个文本框中的任何调用事件处理程序。 sender
参数或e.Source
可用于查找触发事件的文本框。
此格式适用于任何RoutedEvent
,因此Button.Click
或TextBox.TextChanged
等内容可以通过这种方式捕获。