[英]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.