2013-03-16 5 views
-3
에서 프로그램 변경으로 업데이트되지 않습니다

나는 WPF 뷰 모델WPF 텍스트 상자는 뷰 모델

class MainWindowViewModel : INotifyPropertyChanged 
    { 
     private string _sql; 

     public string Sql 
     { 
      get { return _sql; } 
      set 
      { 
       if (value == _sql) return; 
       OnPropertyChanged("Sql"); 
       _sql = value; 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
} 

가 나는 또한

private MainWindowViewModel ViewModel 
    { 
     get { return Resources["viewModel"] as MainWindowViewModel; } 
    } 
뒤에 텍스트 상자에

<Window.Resources> 
    <HbmSchemaExporter:MainWindowViewModel x:Key="viewModel"/> 
</Window.Resources> 
.... 

<TextBox Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="2" Text="{Binding Source={StaticResource ResourceKey=viewModel}, Path=Sql,Mode=OneWay}"/> 

코드를 XAML 뷰를 가지고 있습니다

문제는 코드에서 내가 할 때 viewModel.Sql = SOMETHING 텍스트 상자가 업데이트되지 않습니다. 디버거는 속성에 올바른 값을 표시하지만 텍스트 상자는 비어 있습니다.

또한 바인딩을 TwoWay으로 변경하려고 시도했으나 실제로는 원하지 않는 텍스트 상자에 입력 한 값으로 속성을 덮어 쓸 수 있습니다. 실제로는 읽기 전용으로 만들 필요가 있습니다. 하지만 현재 범위를 벗어났습니다).

프로그래밍 방식으로 속성을 업데이트 한 후 텍스트 상자를 업데이트하려면 어떻게해야합니까?

응용 프로그램은 기본적으로 NHibernate DDL 생성기입니다. this을 읽은 후에 쓰고 있습니다. "Generate SQL"버튼을 눌러 DB로 실행하는 코드를 표시해야합니다.

+0

OP 댓글 : 일단 앱을 잘 작동하게 만들었고 하나의 어셈블리만으로는 오픈 소스가 될 수 없었습니다. –

답변

4
public string Sql 
{ 
    get { return _sql; } 
    set 
    { 
     if (value == _sql) return; 
     OnPropertyChanged("Sql"); 
     _sql = value; 
    } 
} 

그건 의미가 없습니다. PropertyChanged 이벤트 핸들러가 호출 될 때 Sql을 읽는 것은 아직 _sql을 업데이트하지 않았기 때문에 이전 값을 제공합니다. 먼저 값을 업데이트 한 다음 PropertyChanged 이벤트를 발생시켜야합니다.

+0

그랬습니다! 나는 그 코드 조각을 실제로 몇 달 전에 예제에서 복사했고 프로그램 적으로 업데이트 된 속성으로 데이터 바인딩을 사용하지 못했습니다. OnPropertyChanged 뒤에있는 것은 비동기 메커니즘 ("업데이트 된 것으로 표시되는 속성에 대한 UI 스레드 검사 완료 후 처리기와 같은 것")라고 생각했습니다. –

+1

@djechelon 기술적으로 설명 할 수있는 방식으로 일부 컨트롤이 업데이트 될 가능성이 있습니다 그들은 할 수 없어. 그러나 그것은 어떤 이벤트 핸들러가 'PropertyChanged'에 사용되는지에 달려 있습니다. 당신이 그것을 통제 할 수 없다면, 당신은 그것이 부동산을 직접 읽을 수 있다고 가정해야합니다. – hvd