【问题标题】:Data binding not working, What is wrong? Silverlight WP7数据绑定不起作用,怎么了?银光WP7
【发布时间】:2011-10-04 15:56:34
【问题描述】:

我是 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 个小时,开始需要一段时间才能进行简单的绑定......

提前感谢您的帮助! :)

【问题讨论】:

    标签: c# silverlight data-binding windows-phone-7


    【解决方案1】:

    尝试将属性更改为公共:

    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 模式。

    【讨论】:

    • 好吧,我一直希望它能够奏效......但它没有:/无论如何谢谢。
    • @Niklaos:Ray 是对的,您还应该设置 Datacontext。推荐使用 MVVM 模式。我也编辑了答案。
    • 谢谢!我在某处读到数据上下文在根目录上自动设置为此......但看起来这是一个谎言(就像蛋糕一样)。
    【解决方案2】:

    除了需要公开的属性(根据 MichaelS 的回答)之外,绑定还引用设置为控件的 DataContext(或其父级的 DataContext)的对象。

    所以通常您不会让您的 Window 实现 INotifyPropertyChanged,但您会创建另一个实现 INotifyPropertyChanged 的类(通常称为 ViewModel)并将其设置为 Window 的 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;
        }
    }
    

    【讨论】:

    • 感谢您的好建议和想法。我对你的答案投了赞成票:)
    • 毕竟我会选择 ViewModel 方式 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多