数据绑定不工作,出了什么问题?Silverlight WP7

本文关键字:问题 Silverlight WP7 什么 工作 数据绑定 | 更新日期: 2023-09-27 18:10:21

我是Silverlight的新手,我正在尝试使用数据绑定。这看起来很简单,但它不工作,我不知道为什么。

In my MainPage.xaml:

<map:Map Name="bing_map" Height="578" Width="480"
         ZoomLevel="{Binding ZoomLevel, Mode=TwoWay}"
         Center="{Binding Center, Mode=TwoWay}"
         CredentialsProvider="{StaticResource BingMapsKey}" />

正如你所看到的,我正在尝试绑定缩放水平和中心。

我的 mainpage . example .cs

类继承自INotifyPropertyChanged

在构造函数中:

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

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

我忘了什么吗?

数据绑定不工作,出了什么问题?Silverlight WP7

尝试将属性更改为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,但你会创建另一个类(通常称为ViewModel)实现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 . example .cs中你可以这样做

public partial class MainPage
{
    public MainPage(MainWindowViewModel vm)
    {
        this.DataContext = vm;
    }
}
当然,快速修复的方法可能是将页面的DataContext设置为自身。

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