Привязка данных не работает, что не так?Silverlight WP7 - PullRequest
0 голосов
/ 04 октября 2011

Я новичок в 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}" />

Как вы можете видеть, я 'm пытается связать 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 часов, начиная с некоторого времени для простой привязки ...

Заранее благодарю за помощь!:)

Ответы [ 2 ]

4 голосов
/ 04 октября 2011

Попробуйте изменить общие свойства:

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: (как Рэй упомянул в своем ответе)

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

Настоятельно рекомендуется использовать MVVM шаблон.

3 голосов
/ 04 октября 2011

В дополнение к свойствам, которые должны быть общедоступными (согласно ответу MichaelS), привязки ссылаются на объект, для которого задан DataContext элемента управления (или DataContext его родителя).

Таким образом, обычно у вас не будет реализации вашего Window INotifyPropertyChanged, но вы создадите другой класс (обычно называемый ViewModel), который реализует INotifyPropertyChanged, и установите для него значение DataContext.

в Window.

, например

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