听取通用事件

时间:2013-12-18 15:24:15

标签: c# wpf mvvm

我想在更新很多不同的文本框之后运行一个函数,是否可以在更新事件而不是特定事件之后监听一般的通用?

所以,而不是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中的函数?

3 个答案:

答案 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.ClickTextBox.TextChanged等内容可以通过这种方式捕获。