2009-11-12 13 views
42

바인딩 나는이 수업이 있습니다WPF : 간단한 텍스트 상자 데이터

public partial class Window1 : Window 
{ 
    public String Name2; 

    public Window1() 
    { 
     InitializeComponent(); 
     Name2 = new String('a', 5); 
     myGrid.DataContext = this; 
    } 

    // ... 
} 

을 그리고 텍스트 상자에 문자열 Name2을 표시합니다.

<Grid Name="myGrid" Height="437.274"> 
    <TextBox Text="{Binding Path=Name2}"/> 
</Grid> 

그러나 문자열은 표시되지 않습니다. 또한 문자열 Name2TimerCallback을 사용하여 주기적으로 업데이트되는 경우 데이터가 변경 될 때 텍스트 상자가 업데이트되도록하려면해야합니까?

+2

, 당신은 네 개의 공백으로 들여 쓰기 또는 101,010 버튼을 사용하여 코드를 포맷 할 수 있습니다! – itowlson

답변

63

이름 2는 필드입니다. WPF는 속성에만 바인딩됩니다. 이것을 다음으로 변경하십시오 :

public string Name2 { get; set; } 

최소한의 구현으로 TextBox는 Name2의 프로그래밍 방식 변경에 응답하지 않습니다. 당신의 타이머 업데이트 시나리오 그래서, 당신은에서 INotifyPropertyChanged를 구현해야합니다 :

partial class Window1 : Window, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    // usual OnPropertyChanged implementation 

    private string _name2; 

    public string Name2 
    { 
    get { return _name2; } 
    set 
    { 
     if (value != _name2) 
     { 
     _name2 = value; 
     OnPropertyChanged("Name2"); 
     } 
    } 
    } 
} 

당신은 당신의 창 클래스가 아닌 별도의 데이터에이 객체 이동하는 것을 고려한다.

+0

INotifyPropertyChanged 인터페이스 구현에 대한 MSDN의 예 (DemoCustomer 구현으로 스크롤 다운) : http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx –

5

귀하의 Window는 그리드가 데이터 소스로 사용할 필요가있는 데이터 바인딩 통지 즉, INotifyPropertyChanged 인터페이스를 구현하지 않습니다.

데이터 바인딩이 속성과 함께 사용되기 때문에 "Name2"문자열도 공용 변수가 아니고 공용 변수 여야합니다.

개체를 데이터 원본으로 사용하기 위해 필요한 인터페이스를 구현하는 것은 here입니다.

3

앞으로의 필요를 위해서입니다.

.NET Framework 4.5가 설치된 Visual Studio 2013에서 창 속성의 경우 ElementName=window을 추가하여 제대로 작동하도록하십시오. 꺾쇠 괄호를 수동으로 BR 태그로 주변에 비료를 저장하고 탈출 -

팁으로
<Grid Name="myGrid" Height="437.274"> 
    <TextBox Text="{Binding Path=Name2, ElementName=window}"/> 
</Grid> 
관련 문제