C# 如何将多个方法组合到一个方法中
我有15个字段可以做几乎相同的事情: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
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实例化十五次。但是,这是一个学习曲线,如果你太远了,无法重新开始,下面的两个答案都有很好的想法。