【发布时间】:2011-02-07 10:21:33
【问题描述】:
有人请给我指出一个工作示例,说明我应该如何在 Silverlight for Windows Embedded (SWE) 中进行数据绑定。我看过showcase,所以它似乎是可能的。我已经阅读了here,我需要实现 IXRPropertyBag 以使其工作,但还没有找到(工作)关于如何做到这一点的说明。
【问题讨论】:
标签: c++ data-binding silverlight-3.0 windows-ce
有人请给我指出一个工作示例,说明我应该如何在 Silverlight for Windows Embedded (SWE) 中进行数据绑定。我看过showcase,所以它似乎是可能的。我已经阅读了here,我需要实现 IXRPropertyBag 以使其工作,但还没有找到(工作)关于如何做到这一点的说明。
【问题讨论】:
标签: c++ data-binding silverlight-3.0 windows-ce
我设法让数据绑定在两个 ToggleButton 元素的 IsChecked 属性之间工作,基于在随附的帮助文件中找到的 insanely 坏示例与 WCE7 CTP。我本来希望在 XAML 中设置数据上下文和数据绑定,但文档告诉我要对其进行编码。
首先您必须创建一个实现IXRPropertyBag 的类。然后你必须从代码中设置数据上下文和数据绑定到这个属性包的一个实例。
我很抱歉代码中缺少命名约定,但它仍然比 Microsoft 提供的示例要好得多。它也不像它应该的那样通用,但我会把重构留给你。
MyPropertyBag.h:
#pragma once
#include "windows.h"
#include "XamlRuntime.h"
#include "XRCustomEvent.h"
#include "XRPtr.h"
class __declspec(uuid("3C6FFC6F-17A8-4976-B034-B4FE3BFF530A"))
MyPropertyBag : public IXRPropertyBag
{
private:
LONG m_cRef;
IXRCustomEvent<XRPropertyChangedCustomEventArgs, IXRPropertyBag> *pRadioEvent;
XRThreeState RadioState;
public:
MyPropertyBag(void);
HRESULT STDMETHODCALLTYPE GetValue(__in const WCHAR* pstrPropertyName, __out XRValue *pValue);
HRESULT STDMETHODCALLTYPE SetValue(__in const WCHAR* pstrPropertyName, __in XRValue *pValue);
HRESULT STDMETHODCALLTYPE GetPropertyChangedEvent(__out IXRCustomEvent<XRPropertyChangedCustomEventArgs, IXRPropertyBag>** ppEvent);
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, LPVOID * ppvObj);
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
};
MyPropertyBag.cpp:
#include "StdAfx.h"
#include "MyPropertyBag.h"
extern "C" const GUID __declspec(selectany) IID_MyPropertyBag = __uuidof(IXRPropertyBag);
MyPropertyBag::MyPropertyBag(void)
{
RadioState = XRThreeState_Unchecked;
pRadioEvent = CreateCustomEvent<XRPropertyChangedCustomEventArgs, IXRPropertyBag>();
}
// IXRPropertyBag implementation:
HRESULT MyPropertyBag::GetValue(__in const WCHAR* pstrPropertyName, __out XRValue *pValue)
{
HRESULT hr = E_FAIL;
if (0 == wcscmp(pstrPropertyName, L"RadioState"))
{
pValue->vType = VTYPE_INT;
pValue->IntVal = (int)RadioState;
hr = S_OK;
}
return hr;
}
HRESULT MyPropertyBag::SetValue(__in const WCHAR* pstrPropertyName, __in XRValue *pValue)
{
HRESULT hr = E_FAIL;
if (0 == wcscmp(pstrPropertyName, L"RadioState"))
{
RadioState = (XRThreeState)pValue->IntVal;
XRPropertyChangedCustomEventArgs eventArgs;
eventArgs.PropertyName = pstrPropertyName;
pRadioEvent->Raise(this, &eventArgs);
hr = S_OK;
}
return hr;
}
HRESULT MyPropertyBag::GetPropertyChangedEvent(IXRCustomEvent<XRPropertyChangedCustomEventArgs, IXRPropertyBag>** ppEvent)
{
*ppEvent = pRadioEvent;
return S_OK;
}
// end of IXRPropertyBag implementation.
// IUnknown implementation:
HRESULT MyPropertyBag::QueryInterface(REFIID riid, LPVOID * ppvObj)
{
if (!ppvObj)
return E_INVALIDARG;
*ppvObj = NULL;
if (riid == IID_IUnknown || riid == IID_MyPropertyBag)
{
*ppvObj = (LPVOID)this;
AddRef();
return NOERROR;
}
return E_NOINTERFACE;
}
ULONG MyPropertyBag::AddRef()
{
InterlockedIncrement(&m_cRef);
return m_cRef;
}
ULONG MyPropertyBag::Release()
{
ULONG ulRefCount = InterlockedDecrement(&m_cRef);
if (0 == m_cRef)
{
delete this;
}
return ulRefCount;
}
// end of IUnknown implementation.
在可视主机上调用 StartDialog 之前,创建共享属性包并为两个切换按钮调用 BindDataToControl:
// Data bindings
XRPtr<MyPropertyBag> viewModel(new MyPropertyBag());
BindDataToControl(pTb1, viewModel);
BindDataToControl(pTb2, viewModel);
// save the exit code for WinMain
hr = m_pVisualHost->StartDialog(&uiExitCode);
SetWinMainResultCode(uiExitCode);
这是 BindDataToControl 的样子,用于设置 DataContext 和绑定:
inline void App::BindDataToControl(IXRFrameworkElement* pElement, IXRPropertyBag* pPropertyBag)
{
// Set the binding value and source property
XRBinding binding;
binding.Mode = XRBindingMode_TwoWay;
binding.Path = L"RadioState";
pElement->SetBinding(L"IsChecked", &binding);
// Convert the data source object to an XRValue
XRValue dataContext;
dataContext.vType = VTYPE_PROPERTYBAG;
dataContext.pPropertyBagVal = pPropertyBag;
// Set the data source object as the data context for the option button
pElement->SetDataContext(&dataContext);
}
【讨论】:
您也可以使用 TBoundProperty - 请参阅此动手实验室,了解将椭圆的宽度绑定到滑块的简单示例。
MSDN 虚拟实验室:Silverlight for Windows Embedded 中的数据绑定
【讨论】: