बाइंडिंग आम तौर पर BindingContext
संपत्ति से हल कर रहे हैं (अन्य कार्यान्वयन में, इस संपत्ति DataContext
कहा जाता है)। डिफ़ॉल्ट रूप से यह null
है (कम से कम XAML के अन्य कार्यान्वयन में), इस प्रकार आपका दृश्य निर्दिष्ट गुणों को ढूँढने में असमर्थ है।
आपके मामले में, आप this
को BindingContext
गुण सेट करना होगा:
public CardsListXaml()
{
InitializeComponent();
BindingContext = this;
IsLoading = true;
}
बहरहाल, यह अकेले पर्याप्त नहीं होगा। आपका वर्तमान समाधान किसी भी संपत्ति परिवर्तन के दृश्य को सूचित करने के लिए एक तंत्र को लागू नहीं करता है, इसलिए आपके विचार को INotifyPropertyChanged
लागू करना होगा। इसके बजाय, मैं सुझाव है कि आप Model-View-ViewModel पैटर्न, जो न केवल डेटा बाइंडिंग के साथ खूबसूरती से फिट बैठता है को लागू है, लेकिन एक और अधिक maintainable और परीक्षण योग्य कोड बेस में परिणाम होगा:
public class CardsListViewModel : INotifyPropertyChanged
{
private bool isLoading;
public bool IsLoading
{
get
{
return this.isLoading;
}
set
{
this.isLoading = value;
RaisePropertyChanged("IsLoading");
}
}
public CardsListViewModel()
{
IsLoading = true;
}
//the view will register to this event when the DataContext is set
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
}
और फिर अपने कोड-पीछे के निर्माता में:
public CardsListView()
{
InitializeComponent();
BindingContext = new CardsListViewModel();
}
बस स्पष्ट करने के लिए, DataContext
दृश्य पेड़ को कैस्केड करता है, इस प्रकार ActivityIndicator
नियंत्रण बाइंडिंग में निर्दिष्ट गुणों को पढ़ने में सक्षम होगा।
संपादित करें: Xamarin.Forms (और सिल्वरलाइट/WPF आदि ... खेद है, यह एक समय हो गया है!) भी एक SetBinding विधि (देखें डाटा अनुभाग बाइंडिंग) प्रदान करता है।
स्रोत
2014-09-18 13:09:02
'Xamarin.Forms' 'BindableObject के पास 'DataContext' गुण नहीं हैं, लेकिन' BindingContext' –
जानकारी के लिए धन्यवाद! –