2017-05-12 7 views
0

에 여러 방법을 결합하는 것이다 나는 거의 같은 일을 15 개 필드가가 어떻게 하나의 방법

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 번 인스턴스화 된 하나의 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" 
    /> 

하지만 실제로는,이 적절한 UserControl을 작성을위한 가난한 대용품입니다.

+0

답장을 보내 주셔서 감사합니다.하지만 "3"이 하드 코드되어 있어야하기 때문에 15 개를 만들어야합니다. – SomeoneSpecial

+0

나는 int가 다르다는 것을 놓쳤습니다. 잠시만 더 편집하십시오 – maccettura

+0

컨트롤의 새 속성에 액세스 할 수 있도록 업데이트했습니다. – maccettura