Question

I'm sorry to cause you a lot of trouble to read my question, because I'm a Chinese ,my English is poor, but the question has been bothering me a long time.

When I build a test-codes about Databinding,then meet a trouble.

I creat a second thread which has a cycle to generate data-source , then the thread call a method in MainPage to populate ListBoxItem.

The method use two way to do this. One use Databinding and another use ListBoxItem's SetContent().

the result is that the Databinding run about dozens of cycles then stop,but the SetContent() can run to finish.

Following is my whole codes based Windows Embedded Silverlight Tools, and run in CEPC

MainPage.XAML

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

x:Class="test6.MainPage"

Width="640" Height="480">

<Grid x:Name="LayoutRoot" Background="White">

    <Button x:Name="Button1" Height="43" HorizontalAlignment="Right" Margin="0,111,83,0" VerticalAlignment="Top" Width="117" Content="Button"/>

    <ListBoxItem x:Name="ListBoxItem1" HorizontalAlignment="Left" Margin="84,111,0,0" Width="138" Content="{Binding L1}" Height="52" VerticalAlignment="Top" Background="#CEFFA3A3" FontSize="16"/>

    <ListBoxItem x:Name="ListBoxItem2" Height="43" HorizontalAlignment="Left" Margin="84,187,0,0" VerticalAlignment="Top" Width="138" Content="{Binding L2}" Background="#6971FF6E" FontSize="16"/>

</Grid>

First add

pWindowParameters->AllowsMultipleThreadAccess = true;

in App::GetWindowParameters , if not , SetContent() could appear like DataBinding.

Declare in MainPage.h

HRESULT MainPage::UpdateData();

and

DWORD WINAPI Thread2 (PVOID pArg);

DataValue.h:

#pragma once

#include <oleauto.h>

#include "XRCollection.h"

#include "XRPropertyBag.h"

class _declspec(uuid("{9C0158BE-D467-4284-A51A-327DEFE935C5}")) DataValue : public TPropertyBag<DataValue>

{

protected:

    // Protected, create by using TPropertyBag::CreateInstance to create an instance, then call Initialize();

    // this will CreateInstance will use XRObject to implement IUnknown, which saves us work.

    DataValue() {};

public:

    HRESULT Initialize(float l1,float l2)

    {

        HRESULT hr = InitializeProperties();

        m_L1 =l1;

        m_L2 =l2;

        return hr;

    }

     TBoundProperty<float> m_L1;

     TBoundProperty<float> m_L2;

    // Mapping TBoundProperty and property names.

    HRESULT InitializeProperties()

    {

        HRESULT hr = S_OK;

        hr = BeginRegisterProperties();

        if (FAILED(hr))

            return hr;   

        hr = RegisterBoundProperty(L"L1", m_L1);

        if (FAILED(hr))

            return hr;

        hr = RegisterBoundProperty(L"L2", m_L2);

        if (FAILED(hr))

            return hr;

        hr = EndRegisterProperties();

        return hr;

    }

};

In MainPange.cpp:

#include "stdafx.h"

#include "test6Generated.h"

#include "MainPage.h"

#include "App.h"

#include "resource.h"

#include "DataValue.h"

#include "oleauto.h"

#include "XRPropertyBag.h"

static XRPtr<DataValue> pDataValue;

static XRValue xrvalueNew;

static float i=0;

// ============================================================================

//  OnLoaded

//

//  Description: Calls InitializeComponent to bind member variables to named

//               elements, and attach event handlers specified in XAML

//

//  Parameters:  pRoot - The root dependency object.

// ============================================================================

HRESULT MainPage::OnLoaded(__in IXRDependencyObject* pRoot)

{

    UNREFERENCED_PARAMETER(pRoot);

    HRESULT hr = InitializeComponent();

    // Add calls to FindName or Add___EventHandler() methods after this comment.

    DataValue::CreateInstance(&pDataValue);

    pDataValue->Initialize(1,2);

    XRValue DataContext(pDataValue);

    m_pListBoxItem1->SetDataContext(&DataContext);

    //m_pListBoxItem2->SetDataContext(&DataContext);

    HANDLE hThread1;

    hThread1=CreateThread(NULL,0,Thread2,this,0,NULL);

    CloseHandle(hThread1);

    return hr;

} // OnLoaded

DWORD WINAPI Thread2 (PVOID pArg)

{   

    HRESULT hr = E_NOTIMPL;

    MainPage* pMainPage = (MainPage *)pArg;

    while(i<2000)   

    {

        ++i;

            Sleep(200);

    pMainPage->UpdateData();

        }

    return 0;

}

HRESULT MainPage::UpdateData() 

{ 

    xrvalueNew.SetValue(i); 

       XRAutoCriticalSection csObject; 

       EnterCriticalSection(&csObject); 

       //pItemValue->SetValue(L"ID",&xrvalueNew);

       pDataValue->m_L1=i;

       m_pListBoxItem2->SetContent(&xrvalueNew);

       LeaveCriticalSection(&csObject);

              return S_OK; 

}

#pragma region GeneratedCode

// ============================================================================

//  WARNING: DO NOT EDIT THIS ALWAYS-GENERATED CODE

// ============================================================================

HRESULT MainPage::InitializeComponent()

{

    HRESULT hr = E_FAIL;

    FindName(L"LayoutRoot", &m_pLayoutRoot);

    FindName(L"Button1", &m_pButton1);

    FindName(L"ListBoxItem1", &m_pListBoxItem1);

    FindName(L"ListBoxItem2", &m_pListBoxItem2);

    if (m_pLayoutRoot &&

        m_pButton1 &&

        m_pListBoxItem1 &&

        m_pListBoxItem2

       )

    {

        hr = S_OK;

    }

    return hr;

}

// ============================================================================

//  WARNING: DO NOT EDIT THIS ALWAYS-GENERATED CODE

// ============================================================================

#pragma endregion GeneratedCode

the result like that:

http://social.msdn.microsoft.com/Forums/nl-BE/winembnatapp/thread/52e0fd82-e81b-448f-a518-1a8bef5dd8e4

What is the exact way if I want to use DataBinding?I want to build a HMI ,It maybe has hundreds of value and in per 500ms maybe refresh dozens item.

Is SetContent() a feasible way can use in a production environment?

Was it helpful?

Solution

You need to set the TPropertyBag directly. See MSDN

// Don't do this
//pDataValue->m_L1=i;

// Do this instead
pDataValue->SetValue(L"L1", &i)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top