C# 如何将多个方法组合到一个方法中

C# 如何将多个方法组合到一个方法中,c#,xaml,controls,C#,Xaml,Controls,我有15个字段可以做几乎相同的事情: private void TextboxMessage1_TextChanged(object sender, TextChangedEventArgs e) { SaveMessage(TextboxMessage1.Text, TextboxMessageSeconds1.Text.ToInteger(), 1); } private void TextboxMessage2_TextChanged(obje

我有15个字段可以做几乎相同的事情:

    private void TextboxMessage1_TextChanged(object sender, TextChangedEventArgs e)
    {
      SaveMessage(TextboxMessage1.Text, TextboxMessageSeconds1.Text.ToInteger(), 1);
    }

    private void TextboxMessage2_TextChanged(object sender, TextChangedEventArgs e)
    {
      SaveMessage(TextboxMessage2.Text, TextboxMessageSeconds2.Text.ToInteger(), 2);
    }

    private void TextboxMessage3_TextChanged(object sender, TextChangedEventArgs e)
    {
      SaveMessage(TextboxMessage3.Text, TextboxMessageSeconds3.Text.ToInteger(), 3);
    }

etc
哪个调用SaveMessage:

private void SaveMessage(string textboxMessageText, int seconds, int messagenumber)
{
  var msg = _configman.MyConfig.MessageConfigs.FirstOrDefault(x => x.MessageNumber == messagenumber);

  if (msg == null)
  {
    var msgconfig = new MessageConfig();
    msgconfig.Seconds = seconds;
    msgconfig.Command = textboxMessageText;
  }
  else
  {
    msg.MessageNumber = messagenumber;
    msg.Command = textboxMessageText;
    msg.Seconds = seconds;
  }
  _configman.SaveConfig();
}
我的表格:

<CheckBox x:Name="CheckBoxMessage1" Content="" HorizontalAlignment="Left" Margin="29,23,0,0" VerticalAlignment="Top" Width="15"/>
<TextBox x:Name="TextboxMessage1" Height="23" Margin="49,19,158,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" TextChanged="TextboxMessage1_TextChanged"/>
<Button x:Name="ButtonMessage1" Content="Disabled" HorizontalAlignment="Left" Margin="689,20,0,0" VerticalAlignment="Top" Width="75" Background="#FFFB8686" Click="ButtonMessage1_Click"/>
<CheckBox x:Name="CheckBoxMessage2" Content="" HorizontalAlignment="Left" Margin="29,48,0,0" VerticalAlignment="Top" Width="15"/>
<TextBox x:Name="TextboxMessage2" Height="23" Margin="49,44,158,0" TextWrapping="Wrap" VerticalAlignment="Top" TextChanged="TextboxMessage2_TextChanged"/>
<Button x:Name="ButtonMessage2" Content="Disabled" HorizontalAlignment="Left" Margin="689,45,0,0" VerticalAlignment="Top" Width="75" Background="#FFFB8686"/>
<CheckBox x:Name="CheckBoxMessage3" Content="" HorizontalAlignment="Left" Margin="29,72,0,0" VerticalAlignment="Top" Width="15"/>
<TextBox x:Name="TextboxMessage3" Height="23" Margin="49,68,158,0" TextWrapping="Wrap" VerticalAlignment="Top" TextChanged="TextboxMessage3_TextChanged"/>
<Button x:Name="ButtonMessage3" Content="Disabled" HorizontalAlignment="Left" Margin="689,69,0,0" VerticalAlignment="Top" Width="75" Background="#FFFB8686"/>

有没有办法让TextChanged覆盖我所有的文本框,这样我就不必为每个文本框创建一个TextChanged

它们编号为1-15,如TextboxMessage1、TextboxMessage1等


这可能吗?如果是这样的话,我该怎么做呢?

最好的方法是使用继承自
TextBox的
int
属性创建一个新类

//Come up with a better name
public class CustomTextBox : TextBox
{
    public int Number { get; set; }
}
然后在xaml中将属性类型更改为
CustomTextBox
(或任何您命名的属性)。确保添加
Number
属性,并将
TextChanged
属性更改为“TextBoxSave\u TextChanged”:


教育署的建议:

public class CustomTextBox : TextBox
{
    #region Number Property
    public int Number
    {
        get { return (int)GetValue(NumberProperty); }
        set { SetValue(NumberProperty, value); }
    }

    public static readonly DependencyProperty NumberProperty =
        DependencyProperty.Register(nameof(Number), typeof(int), typeof(CustomTextBox),
            new PropertyMetadata(0));
    #endregion Number Property

    #region Seconds Property
    public int Seconds
    {
        get { return (int)GetValue(SecondsProperty); }
        set { SetValue(SecondsProperty, value); }
    }

    public static readonly DependencyProperty SecondsProperty =
        DependencyProperty.Register(nameof(Seconds), typeof(int), typeof(CustomTextBox),
            new PropertyMetadata(0));
    #endregion Seconds Property
}
TextChanged处理程序:

//  You can name it whatever, I would keep the "_TextChanged" suffix though
private void TextBoxSave_TextChanged(object sender, TextChangedEventArgs e)
{
    //Cast sender to your new CustomTextBox type
    CustomTextBox txtBox = (CustomTextBox)sender;

    SaveMessage(txtBox.Text, txtBox.Seconds, txtBox.Number);
}
XAML用法:

<local:CustomTextBox 
    Number="1"
    Seconds="{Binding Text, ElementName=TextboxMessageSeconds1}"
    TextChanged="TextBoxSave_TextChanged" 

    x:Name="TextboxMessage1" 
    Height="23" 
    Margin="49,19,158,0" 
    TextWrapping="Wrap"
    VerticalAlignment="Top" 
    />


但实际上,这是编写正确的用户控件的一个糟糕的替代品。

最好的方法是使用继承自
TextBox的
int
属性创建一个新类

//Come up with a better name
public class CustomTextBox : TextBox
{
    public int Number { get; set; }
}
然后在xaml中将属性类型更改为
CustomTextBox
(或任何您命名的属性)。确保添加
Number
属性,并将
TextChanged
属性更改为“TextBoxSave\u TextChanged”:


教育署的建议:

public class CustomTextBox : TextBox
{
    #region Number Property
    public int Number
    {
        get { return (int)GetValue(NumberProperty); }
        set { SetValue(NumberProperty, value); }
    }

    public static readonly DependencyProperty NumberProperty =
        DependencyProperty.Register(nameof(Number), typeof(int), typeof(CustomTextBox),
            new PropertyMetadata(0));
    #endregion Number Property

    #region Seconds Property
    public int Seconds
    {
        get { return (int)GetValue(SecondsProperty); }
        set { SetValue(SecondsProperty, value); }
    }

    public static readonly DependencyProperty SecondsProperty =
        DependencyProperty.Register(nameof(Seconds), typeof(int), typeof(CustomTextBox),
            new PropertyMetadata(0));
    #endregion Seconds Property
}
TextChanged处理程序:

//  You can name it whatever, I would keep the "_TextChanged" suffix though
private void TextBoxSave_TextChanged(object sender, TextChangedEventArgs e)
{
    //Cast sender to your new CustomTextBox type
    CustomTextBox txtBox = (CustomTextBox)sender;

    SaveMessage(txtBox.Text, txtBox.Seconds, txtBox.Number);
}
XAML用法:

<local:CustomTextBox 
    Number="1"
    Seconds="{Binding Text, ElementName=TextboxMessageSeconds1}"
    TextChanged="TextBoxSave_TextChanged" 

    x:Name="TextboxMessage1" 
    Height="23" 
    Margin="49,19,158,0" 
    TextWrapping="Wrap"
    VerticalAlignment="Top" 
    />


但实际上,这并不能代替编写正确的用户控件。

为什么不为每个TextChanged事件使用相同的“通用”回调,如“TextboxMessage\u TextChanged”。 然后:


这是您所期望的吗?

为什么不为每个TextChanged事件使用相同的“通用”回调,如“TextboxMessage\u TextChanged”。 然后:


这是您所期望的吗?

谢谢您的回复,但我仍然需要创建15个,因为“3”必须是硬编码的,除非我遗漏了什么?我遗漏了int的不同之处。请给我一点时间编辑刚做了一个更新,允许您访问控件的新属性。@maccettura SaveMessage()的第二个参数正在解析来自不同控件的文本(TextMessageSecondsN vs TextMessage),因此CustomTextBox还需要一个依赖属性,以便他可以使用ElementName绑定到另一个控件。或者他可以从Gizmo的答案中偷取FindName代码。@maccettura好吧,他也可以继续使用Gonzo建议的糟糕代码(但比原来的代码要糟糕得多!)。你介意我把依赖属性的代码附加到你的答案中吗?谢谢你的回复,但我仍然需要创建15个,因为“3”必须是硬编码的,除非我遗漏了什么?我遗漏了int的不同。请给我一点时间编辑刚做了一个更新,允许您访问控件的新属性。@maccettura SaveMessage()的第二个参数正在解析来自不同控件的文本(TextMessageSecondsN vs TextMessage),因此CustomTextBox还需要一个依赖属性,以便他可以使用ElementName绑定到另一个控件。或者他可以从Gizmo的答案中偷取FindName代码。@maccettura好吧,他也可以继续使用Gonzo建议的糟糕代码(但比原来的代码要糟糕得多!)。您介意我在您的答案中附加依赖属性的代码吗?这就是人们使用MVVM的原因。使用MVVM,这种事情变得非常简单。如果您学习MVVM,并学习适当的XAML技术,如StackPanel和grid布局以及样式,您的生活将变得更加简单,代码也将变得更加可读。您应该有一个UserControl或DataTemplate,由ItemsControl实例化十五次。但是,这是一个学习曲线,如果你在这条路上走得太远而无法重新开始,下面的两个答案都有很好的想法。这就是人们使用MVVM的原因。使用MVVM,这种事情变得非常简单。如果您学习MVVM,并学习适当的XAML技术,如StackPanel和grid布局以及样式,您的生活将变得更加简单,代码也将变得更加可读。您应该有一个UserControl或DataTemplate,由ItemsControl实例化十五次。但是,这是一个学习曲线,如果你太远了,无法重新开始,下面的两个答案都有很好的想法。