簡體   English   中英

數據綁定不起作用,怎么了? 銀光WP7

[英]Data binding not working, What is wrong? Silverlight WP7

我是Silverlight的新手,正在嘗試使用數據綁定。 這看起來很簡單,但無法正常工作,我找不到原因...

在我的MainPage.xaml中

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

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

         CredentialsProvider="{StaticResource BingMapsKey}" />

如您所見,我正在嘗試對ZoomLevel和Center進行綁定。

在我的MainPage.xaml.cs中

該類繼承自INotifyPropertyChanged

在構造函數中:

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));
}

我忘記了什么?

我已經堅持了3個小時,開始需要一段時間才能進行簡單的綁定...

預先感謝您的幫助! :)

嘗試將屬性更改為public:

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"); }
}

並設置View DataContext :(如Ray在他的回答中所述)

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

強烈建議使用MVVM模式。

除了需要公開的屬性(按照MichaelS的回答)之外,綁定還引用設置為控件的DataContext(或其父級的DataContext)的對象。

所以通常你不會有你的窗口實現INotifyPropertyChanged ,但你會創建另一個類(通常稱為視圖模型),它實現INotifyPropertyChanged ,並設置為窗口的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;
    }
}

當然,對您來說,一個快速的解決方法可能就是將您的DataContext設置為頁面本身。

例如

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM