2017-05-12 6 views
0

にして複数の方法を組み合わせてしまう私は実質的に同じことを行う15個のフィールドを持っているはどのように私は1つの方法

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を作成する必要はありませんか?

彼らはなどTextboxMessage1、TextboxMessage1、

として1-15の番号が付けられ、これは可能ですか?もしそうなら、どうすればいいのですか?

+0

これは、人々がMVVMを使用する理由です。この種のことは、MVVMでは非常に簡単になります。 MVVMを学び、StackPanelやグリッドレイアウト、Stylesなどの適切なXAMLテクニックを学ぶならば、人生はずっと簡単になり、コードははるかに簡単で読みやすくなります。 ItemsControlによって15回インスタンス化された1つのUserControlまたはDataTemplateが必要です。しかし、これは少し学習曲線です。あなたが出発するのが遠すぎる場合は、以下の両方の回答が良いアイデアを持っています。 –

答えて

2

TextChangedイベントごとに「TextboxMessage_TextChanged」のような同じ「汎用」コールバックを使用しないのはなぜですか。その後 :

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

private void TextboxMessage_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    TextBox tb = sender as TextBox; 
    int index = int.Parse(tb.Name.Substring("TextboxMessage".Length)); 
    TextBox secondTextBox = (TextBox)this.FindName("TextboxMessageSeconds" + index); 
    SaveMessage(tb.Text, secondTextBox.Text.ToInteger(), index); 
} 

はこのようなものは、あなたが期待しているということですか?

+0

さらに良い!偉大な作品Tyvm! – SomeoneSpecial

1

最良の方法は、その後、あなたのXAMLでCustomTextBox(または何でもあなたはそれに名前を付ける)にプロパティの種類を変更TextBox

//Come up with a better name 
public class CustomTextBox : TextBox 
{ 
    public int Number { get; set; } 
} 

から継承intプロパティを使用して新しいクラスを作成することです。 Numberプロパティを追加することを確認しますと、 "TextBoxSave_TextChanged" にTextChangedプロパティを変更:

<CustomTextBox x:Name="TextboxMessage1" Height="23" Margin="49,19,158,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" TextChanged="TextBoxSave_TextChanged" Number="1"/> 

次に、あなたのコード内の後ろに新しいメソッドを追加TextBoxSave_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.Text.ToInteger(), txtBox.Number); 
} 

エドの提案:

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" 
    /> 

しかし、実際に、これは適切なユーザーコントロールを作成するための貧弱な代用品です。

+0

返事ありがとうございますが、私は何かが欠けていない限り、 "3"がハードコードされている必要があるので、私はまだそれらの15を作成する必要がありますか? – SomeoneSpecial

+0

私はintのそれが違っていたのを忘れました。もう一度編集してください – maccettura

+0

あなたのコントロールの新しいプロパティにアクセスするためのアップデートを行いました。 – maccettura

関連する問題