2013-06-21 1 views
-5

나는 2 일 내 머리를 긁었다. .NET에 익숙하지는 않지만 20 개 이상의 게시물과 질문을 읽었으며 코드가 제대로 작동해야한다고 생각합니다. 일부는 빛을 던져주세요.INotifyProperty 값을 업데이트하지 않는 변경된 값

XAML :

<TextBox Grid.Column="3" Name="testgrid" Text="{Binding textsource, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"></TextBox> 

코드 숨김

public MainWindow() 
{ 
    InitializeComponent(); 
    textbind tb = new textbind(); 
    tb.textsource = "one"; //one is displayed in the textbox. 
    testgrid.DataContext = tb; 
} 

그리고 :

public class textbind : INotifyPropertyChanged 
{ 
     public event PropertyChangedEventHandler PropertyChanged; 

     private void NotifyPropertyChanged(String info) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(info)); 
      } 
     } 

    private string a=string.Empty; 
    public textbind() 
    { 

    } 


    public string textsource 
    { 
     get { return a; } 
     set 
     { 
      if (value != a) 
      { 
       a = value; 
       NotifyPropertyChanged(textsource); 
      } 
     } 


     } 
} 

변경 특성 :

public class changevalue 
{ 
    //code doing things. this class is initialized by some other processes. 
    textbind tb1 = new textbind(); 
    tb1.textsource = "two"; // no updates to two in the text box. 
} 

내가 믿는 것은 textsource 속성을 변경할 때마다 텍스트 상자의 변경 내용을 반영하지만 변경되지 않습니다. Soneone가 도와주세요.

감사합니다.

+0

모드 = TwoWay 일 수 있습니까? –

+0

특정 문제는 해결되지 않지만 실제로 NotifyPropertyChanged를 변경하여 'var handler = PropertyChanged; PropertyChanged가 테스트와 실행 사이에서 null로 갈 수있는 스레딩 문제를 피하려면 if (handler! = null) {handler (this, new PropertyChangedEventArgs (info));} –

+1

[먼저 디버깅하는 방법 알아보기] (http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application.aspx) . –

답변

2

바운드 오브젝트와 완전히 다른 오브젝트를 편집 중입니다.

당신이 당신의 메인 윈도우 클래스에 당신이 당신의 MainWindow를 클래스에없는 경우에 당신은 당신이에 데이터 컨텍스트에 넣어 textbind의 인스턴스를 전달 확인해야합니다 당신이

((textbind)testgrid.DataContext).textsource = "two"; 

을 할 수 Aslong 어느 방법이 업데이트를 수행하고 있습니다.

은 또한 당신은

public string textsource 
{ 
    get { return a; } 
    set 
    { 
    if (value != a) 
    { 
     a = value; 
     NotifyPropertyChanged("textsource"); 
    } 
    } 
} 

변경된 속성의 이름은 값이 아니다 notifypropertychanged에 전달 될 필요가에 textsource의 구현을 변경해야합니다.

Naresh의 새로운 설명에 대한 응답으로 업데이트되었습니다.

당신의 변화 값 클래스의 예를 들어 하나 무언가

public class changevalue { 
public void doChange(textbind source) { 
    source.textsource = "two"; // no updates to two in the text box. 
} 
} 

처럼 당신은 다음 doChange에 textbind 인스턴스를 전달해야합니다, 그래서 당신은, 인스턴스를 추적하고 코드에서 주위를 통과해야합니다 기능, 즉 mainform에서 호출하는 경우.

또는 당신이 당신의 changevalue 클래스를 초기화 이제까지 당신이 양식에 대한 참조를 가질 필요가 어디 그런

public class changevalue { 
    public textbind source {get; private set;} 

    public changevalue() { 
     this.source = new textbind(); 
    } 

    public void doChange() { 
    source.textsource = "two"; // no updates to two in the text box. 
    } 
} 

을 할 수 있습니다. 그럼 할 수 있어요

var myChangeValue = new changevalue(); 
mymainform.DataContext = myChangeValue.source; 
+0

예. 나는 지금 실수를 알고있다. – Naresh

+0

인스턴스를 다른 메소드로 전달하는 것에 대해 좀 더 자세한 정보를 제공해 주시겠습니까? 감사합니다 – Naresh

+0

아, 나는 당신이 업데이 트를 참조하십시오. 나는 마침내 내가 원하는 것을 얻었지만. 당신이 말한대로, 참고를 통과했다. 엄청 고마워. 그것을 이해하는 데는 많은 시간이 필요했습니다. – Naresh

4
if (value != a) 
{ 
    a = value; 
    NotifyPropertyChanged("textsource"); 
} 

textsource를 변수로 전달하고 NotifyPropertyChanged가 textsource의 실제 값으로 증가했습니다. 대신에 "textsource"라는 이름을 전달해야합니다.

+2

@Naresh : 이것이 아무런 차이가 없다고 생각하면 자신이 무엇을하고 있는지 전혀 모른다. –

2

보기가 textbind 개체 (사용자의 경우 tb)의 단일 인스턴스에 바인딩되어 있습니다. 해당 객체를 변경할 수 있습니다 경우, 뷰에 반영됩니다 :

tb.textsource = "new value"; 

그러나 무엇 당신이이 수정 기대 뷰에 바인딩되어 있지 않은 새로운 textbind 객체 (tb1)를 만드는 일을하는지 그것이 바뀔 때를 보아라. 그리고 그것은 물건이 일하는 방식이 아니다. 작동하려면 tb1을 새로 설정해야합니다. DataContext; 그러나 실제로 수행해야 할 작업은 단순히 원래 바인딩 된 개체의 textbind 속성을 변경하는 것입니다. 또한

, Nightwish91 언급했다 @로, 당신의 NotifyPropertyChanged 호출 그렇지 않으면보기가 잘못된 속성 변경 알림을 얻을 것이다이

NotifyPropertyChanged("textsource"); 

과 같아야 예상대로 업데이트되지 않습니다.

+0

나는 당신이 말한 것을 얻습니다. 그렇다면 어떻게해야합니까? 매번 변화하는 맥락? 나는 구현에 맞았다. – Naresh

+0

업데이트 된 답변보기 - 동일한 DataContext를 유지하면서 원래 'textbind' 인스턴스를 수정해야합니다. –

+1

@Naresh DataContext에서 * 기존 * 개체를 가져 와서 변경하십시오. ((textbind) testgrid.DataContext) .textsource = "new value";'. ** 답안 **을 모두 결합하여 일을 진행하십시오. – Clemens

관련 문제