2011-10-04 5 views
0

저는 Silverlight를 처음 사용하고 있으며 데이터 바인딩을 사용하려고합니다. 당신이 볼 수 있듯이 내 에서 MainPage.xaml에서 이 간단 보이지만 작동하지 않습니다와 나는 이유를 찾을 수 없습니다 ...데이터 바인딩이 작동하지 않습니다. 무엇이 잘못 되었습니까? Silverlight WP7

<map:Map Name="bing_map" Height="578" Width="480" 

     ZoomLevel="{Binding ZoomLevel, Mode=TwoWay}" 
     Center="{Binding Center, Mode=TwoWay}" 

     CredentialsProvider="{StaticResource BingMapsKey}" /> 

, 나는 개의 zoomLevel와 구속을 시도하고있어 센터.

ZoomLevel = 12.0; 
Center = new GeoCoordinate(0, 0); 

속성 :

private double _zoom_level; 
private double ZoomLevel 
{ 
    get { return _zoom_level; } 
    set { 
     if (_zoom_level == value) return; 
     _zoom_level = value; 
     RaisePropertyChanged("ZoomLevel");} 
} 

private GeoCoordinate _center; 
private GeoCoordinate Center 
{ 
    get { return _center; } 
    set { 
     if (_center == value) return; 
     _center = value; 
     RaisePropertyChanged("Center"); } 
} 

public event PropertyChangedEventHandler PropertyChanged; 
void RaisePropertyChanged(string propertyName) 
{ 
    var handler = PropertyChanged; 
    if (handler != null) 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
} 
MainPage.xaml.cs를에서

에서 클래스 상속은 생성자에서

을에서 INotifyPropertyChanged

나는 뭔가를 잊고 있습니까?

나는

당신의 도움에 미리 감사드립니다 ... 바인딩 간단한에 잠시 것으로 시작 3 시간 동안이 붙어 있습니다! :)

답변

4

대중의 속성을 변경해보십시오 :

private double _zoom_level; 
public double ZoomLevel 
{ 
    get { return _zoom_level; } 
    set { 
     if (_zoom_level == value) return; 
     _zoom_level = value; 
     RaisePropertyChanged("ZoomLevel");} 
} 

private GeoCoordinate _center; 
public GeoCoordinate Center 
{ 
    get { return _center; } 
    set { 
     if (_center == value) return; 
     _center = value; 
     RaisePropertyChanged("Center"); } 
} 

또한보기 DataContext를 설정 : (레이는 그의 대답에 언급 한 바와 같이) 높은 MVVM 사용하는 것이 좋습니다

public partial class MainPage 
{ 
    public MainPage() 
    { 
     this.DataContext = this; 
    } 
} 

무늬.

+0

글쎄 나는 그렇게 열심히 노력하고 있었으면 좋겠다고 생각했다. 그러나 그렇지 않았다. :/어쨌든. –

+1

@Niklaos : Ray가 맞습니다. Datacontext도 설정해야합니다.MVVM 패턴을 사용하는 것이 좋습니다. 나는 대답도 편집했다. – MichaelS

+0

고마워요! 나는 어딘가에서 데이터 컨텍스트가 루트에 자동으로 설정된다는 것을 읽었지 만 그것은 거짓말 (케이크와 같은) 인 것처럼 보입니다. –

3

바인딩은 공개 (MichaelS의 답변에 따라)해야하는 속성 외에도 컨트롤의 DataContext (또는 부모의 DataContext)로 설정된 개체를 참조합니다.

그래서 일반적으로 당신은 당신의 창 INotifyPropertyChanged을 구현하지 않았을하지만 당신은 INotifyPropertyChanged를 구현 (일반적으로 뷰 모델이라고 함) 다른 클래스를 만들 것이며, 해당 설정 윈도우의 DataContext.

당신은 페이지 수에 대한 당신의의 DataContext를 설정할 수 있습니다에 대한

public class MainWindowViewModel : INotifyPropertyChanged 
{ 
    private GeoCoordinate _center; 
    public GeoCoordinate Center 
    { 
     get { return _center; } 
     set 
     { 
      if (_center == value) return; 
      _center = value; 
      RaisePropertyChanged("Center"); } 
     } 

    public event PropertyChangedEventHandler PropertyChanged; 
    void RaisePropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

는 그런 다음 MainPage.xaml.cs를 당신은, 물론이

public partial class MainPage 
{ 
    public MainPage(MainWindowViewModel vm) 
    { 
     this.DataContext = vm; 
    } 
} 

같은 빠른 수정을 뭔가를 할 수 그 자체.

public partial class MainPage 
{ 
    public MainPage() 
    { 
     this.DataContext = this; 
    } 
} 
+0

좋은 조언과 아이디어에 감사드립니다. 나는 당신의 대답을 표결했습니다 :) –

+0

그리고 결국 ViewModel 방식으로 갈 것입니다;) –

관련 문제