2013-01-17 2 views
1

두 개의 텍스트 상자로 컴파일되고 .으로 구분 된 데이터베이스에 저장된 문자열이 있습니다. TextBox2이 있고 다른 하나에 5이 있으면 2.5이 데이터베이스에 저장됩니다.TextBox를 문자열의 일부로 바인딩

문제점은 저장된 답변을로드하는 것입니다. 어쨌든 TextBox.Text을 문자열의 특정 문자에만 바인딩 할 수 있습니까 (예 : 첫 번째 텍스트 상자는 항상 SavedAnswer[0]이고 다른 하나는 SavedAnswer[2]입니다) 또는 변환기를 만들고 전체 대답을 전달한 다음 구문 분석해야합니까?

+0

나는이 할 것이라고 생각하는 (또는 어쩌면 내가 이해하지 못했다) : textBox1.Text = savedAnswer [0]로 .toString(); textBox2.Text = savedAnswer [2] .ToString(); – fabricio

+0

SiLo의 대답은 갈 길입니다. 일반적으로 View-Model은 뷰의 논리적 모델입니다. 그 책임은 모델의 데이터를 뷰의 바인드 가능 특성으로 변환하는 것입니다. – EtherDragon

답변

3

당신이 그것에 대해 갈 수있는 몇 가지 방법이 있습니다. 가장 쉬운 방법은 모델에 별도로 바인딩하는 두 개의 관련 속성이 있도록하는 것입니다. 중요한 부분은 변경 사항을 반영하기 위해 Binding이 UI에서 올바르게 작동하도록 해당 참가자의 PropertyChanged 이벤트가 발생했는지 확인하는 것입니다.

예 :

public class MyModel : INotifyPropertyChanged 
{ 
    string fullAnswer; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public string FullAnswer 
    { 
    get { return fullAnswer; } 
    set 
    { 
     if(string.Equals(value, fullAnswer)) return; // skip for equal values 

     fullAnswer = value; 
     OnPropertyChanged("FullAnswer"); 
     OnPropertyChanged("Answer1"); 
     OnPropertyChanged("Answer2"); 
    } 
    } 

    public string Answer1 
    { 
    get 
    { 
     if(fullAnswer == null) return null; 

     var tokens = fullAnswer.Split('.'); 
     if(tokens.Length < 1) return string.Empty; 

     return tokens[0]; 
    } 
    } 

    public string Answer2 
    { 
    get 
    { 
     if(fullAnswer == null) return null; 

     var tokens = fullAnswer.Split('.'); 
     if(tokens.Length < 2) return string.Empty; 

     return tokens[1]; 
    } 
    } 

    protected void OnPropertyChanged(string propertyName) 
    { 
    var handler = this.PropertyChanged; 

    if(handler != null) 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

감사! 이게 정확히 내가 필요로하는 것처럼 보입니다. 질문,'.' (텍스트가 두 텍스트 상자에 입력되지 않은) 전후에 값이 없으면'Split'을 호출 할 때 예외가 발생합니까? – Saggio

+1

네, 일부 보호 장치를 수정 해 드리겠습니다. – Erik

+0

감사! 나는 값이 입력되었는지를 결정하기 위해'str.Length()'를 사용할 것이고, 나는 토큰을 세는 것에 대해서 생각조차하지 않았다. 훨씬 더 청결한! – Saggio

0

문자열의 이름은 "str"이고 항상 "."문자가 포함됩니다. caracter :

TextBox1.Text = str.Split('.')[0]; 
TextBox2.Text = str.Split('.')[1]; 

또는 :

string[] SavedAnswer = str.Split('.'); 
TextBox1.Text = SavedAnswer [0]; 
TextBox2.Text = SavedAnswer [1]; 
0

는 이러한 세 가지 속성을 사용합니다.

public string FullNumber 
{ 
    get 
    { 
     if (String.IsNullOrEmpty(DecimalPart)) { 
      return IntegerPart; 
     } else if (String.IsNullOrEmpty(IntegerPart)) { 
      return "0." + DecimalPart; 
     } 
     return IntegerPart + "." + DecimalPart; 
    } 
    set 
    { 
     if (String.IsNullOrEmpty(value)) { 
      IntegerPart = ""; 
      DecimalPart = ""; 
     } else if (value.Contains(".")) { 
      string[] parts = value.Split('.'); 
      IntegerPart = parts[0]; 
      DecimalPart = parts[1]; 
     } else { 
      IntegerPart = value; 
      DecimalPart = ""; 
     } 
    } 
} 

public string IntegerPart { get; set; } 
public string DecimalPart { get; set; } 

FullNumber

얻을과 전체 수를 설정하는 데 사용할 수 있으며, DB의 수를 읽거나 DB에 번호를 저장할 때 따라서는 사용됩니다. IntegerPartDecimalPart 속성은 두 개의 텍스트 상자에 바인딩됩니다. 데이터 바인딩을 사용하지 않으려는 경우 IntegerParttextBox1.TextDecimalPart으로 바꾸고 textBox2.TextFullNumber 코드로 바꿀 수 있습니다.

숫자가 비어 있거나 null인지 여부와 소수점 포함 여부에 관계없이 작동합니다.

관련 문제