IXRPropertyBag (Compact 2013)
3/28/2014
This C++ base class provides methods that the XAML for Windows Embedded data binding engine uses to access or modify the value of a property of a data source object.
Syntax
class IXRPropertyBag : public IUnknown
Inheritance Hierarchy
IXRPropertyBag
Methods
Method |
Description |
---|---|
Retrieves the custom event that changes the value of the property in this property bag. |
|
Retrieves the value of the property of a data source object. |
|
Updates the value of the property of a data source object. |
Thread Safety
Because IXRPropertyBag is a base class and users either use methods implemented in a derived class or implement the methods in a custom data source class, the methods are not thread safe. To ensure thread safety in a custom derived class, the derived method implementations can implement functionality to block other threads. For more information, see XRAutoCriticalSection.
Remarks
This class inherits from IUnknown.
If you prefer to develop custom functionality for managing data source properties and handling the PropertyChanged event, implement IXRPropertyBag on a data source object. If you prefer to use a property bag that works by default with the iXRPropertyBinding data source property implementation, provides GetValue and SetValue methods that you do not have to overwrite with custom implementations, and handles the PropertyChanged event, use TPropertyBag<Derived> instead.
One way to implement data binding for single-value elements is to implement a data source object that implements IXRPropertyBag.
To bind data from a data source object that implements IXRPropertyBag to a property of a XAML for Windows Embedded UI object, you can do the following:
- In the data source object, implement IXRPropertyBag.
- In the data source object, write a custom implementation of IXRPropertyBag::GetValue and/or IXRPropertyBag::SetValue.
- In the UI object, call IXRFrameworkElement::SetDataContext, and then supply your data source object as an XRValue of type VTYPE_PROPERTYBAG.
- In the UI object, call IXRFrameworkElement::SetBinding, and then supply the data flow direction and the property name.
Your data source object does not have to be a XAML for Windows Embedded object and does not have to inherit from IXRDependencyObject.
In order for a UI control to be used as the data source for another UI control, both controls must be data-bound to the same property in a data source object that implements IXRPropertyBag or a derived class, and one of the UI controls must support XRBindingMode_TwoWay.
When you create a class instance, use an IXRPropertyBagPtr smart pointer instead of a raw interface pointer. For more information, see XRPtr<Interface>.
For more information about the differences in data binding between Microsoft Silverlight 3 and XAML for Windows Embedded, see Differences Between Microsoft Silverlight 3 and XAML for Windows Embedded.
.NET Framework Equivalent
None.
Example
The following example code shows how to display the state of a radio by using an IXRToggleButton object in the UI that employs one-way and two-way data binding.
Important
For readability, the following code example does not contain security checking or error handling. Do not use the following code in a production environment.
#include "windows.h"
#include "XamlRuntime.h"
#include "XRCustomEvent.h"
#include "XRPtr.h"
// The custom data source object that holds radio station state
class CRadioStation : public IXRPropertyBag
{
private:
bool RadioState;
IXRCustomEvent<XRPropertyChangedCustomEventArgs, IXRPropertyBag> *pRadioEvent;
public:
void RadioStation()
{
RadioState = false;
CreateEvent();
}
virtual HRESULT STDMETHODCALLTYPE CreateEvent()
{
pRadioEvent = CreateCustomEvent<XRPropertyChangedCustomEventArgs, IXRPropertyBag>();
}
virtual HRESULT STDMETHODCALLTYPE GetValue(__in const WCHAR* pstrPropertyName, __out XRValue *pValue)
{
HRESULT hr = E_FAIL;
if (0 == wcscmp(pstrPropertyName, L"RadioState"))
{
XRValue propValue;
propValue.vType = VTYPE_BOOL;
propValue.BoolVal = RadioState;
hr = S_OK;
}
}
virtual HRESULT STDMETHODCALLTYPE SetValue(__in const WCHAR* pstrPropertyName, __in XRValue *pValue)
{
HRESULT hr = E_FAIL;
if (0 == wcscmp(pstrPropertyName, L"RadioState"))
{
RadioState = pValue->BoolVal;
XRPropertyChangedCustomEventArgs eventArgs;
eventArgs.PropertyName = pstrPropertyName;
pRadioEvent->Raise(this, &eventArgs);
hr = S_OK;
return hr;
}
}
};
void BindDataToControl(IXRToggleButton* pOptionButton, IXRApplication* pApplication)
{
// Create the data source object
XRPtr<CRadioStation> DataSource;
pApplication->CreateObject(&DataSource);
// Convert the data source object to an XRValue
XRValue value;
value.vType = VTYPE_PROPERTYBAG;
value.pPropertyBagVal = DataSource;
// Set the data source object as the data context for the option button
pOptionButton->SetDataContext(&value);
// Set the binding value and source property
XRBinding Binding;
Binding.Mode = XRBindingMode_TwoWay;
Binding.Path = L"RadioState";
pOptionButton->SetBinding(L"IsChecked", &Binding);
// Bind the data-source property to the option button
bool IsChecked;
XRValue StateValue;
StateValue.vType = VTYPE_BOOL;
DataSource->GetValue(L"RadioState", &StateValue);
IsChecked = StateValue.BoolVal;
if (IsChecked)
{
pOptionButton->SetIsChecked(XRThreeState_Checked);
}
// Bind the user-updated value in option button to the data source
XRThreeState checkedState;
XRValue NewValue;
NewValue.vType = VTYPE_BOOL;
pOptionButton->GetIsChecked(&checkedState);
if (checkedState == XRThreeState_Checked)
{
NewValue.BoolVal = true;
DataSource->SetValue(L"RadioState", &NewValue);
}
if (checkedState == XRThreeState_Unchecked)
{
NewValue.BoolVal = false;
DataSource->SetValue(L"RadioState", &NewValue);
}
}
For more information about APIs used in this example, see IXRApplication, IXRToggleButton, XRValue, XRThreeState, IXRFrameworkElement::SetDataContext, and XRPropertyChangedCustomEventArgs.
Requirements
Header |
XamlRuntime.h |
sysgen |
SYSGEN_XAML_RUNTIME |
See Also
Reference
Classes for Populating UI Elements with Data
TPropertyBag<Derived>