Привязка данных в Silverlight для Windows Embedded (SWE) - PullRequest
3 голосов
/ 07 февраля 2011

Может ли кто-нибудь , пожалуйста, указать мне рабочий пример того, как я должен выполнять привязку данных в Silverlight для Windows Embedded (SWE).Я видел витрину , так что это представляется возможным.И я прочитал здесь , что мне нужно реализовать IXRPropertyBag, чтобы он работал, но пока не нашел (работающих) инструкций о том, как это сделать.

Ответы [ 2 ]

5 голосов
/ 08 февраля 2011

Мне удалось заставить работать привязку данных между свойством IsChecked двух элементов ToggleButton на основе безумного примера, найденного в файлах справки, поставляемых сWCE7 ОСАГО.Я ожидал установить контекст данных и привязки данных в 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.

Создайте сумку общих свойств и вызовите BindDataToControl для обеих кнопок переключения перед вызовом StartDialog на визуальном хосте:

// 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);
}
1 голос
/ 18 февраля 2011

Вы также можете использовать TBoundProperty - см. Этот практический материал для простого примера привязки ширины эллипса к слайдеру.

Виртуальная лаборатория MSDN: привязка данных в Silverlight для Windows Embedded

https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032474142&EventCategory=3&culture=en-US&CountryCode=US

...