Пожалуйста, помогите мне проверить код привязки данных в Silverlight для Windows Embedded - PullRequest
0 голосов
/ 10 января 2012

Извините, что доставляю вам много хлопот, читая мой вопрос, потому что я китаец, у меня плохой английский, но вопрос беспокоит меня долгое время.

Когда ясоздайте тестовые коды для привязки данных, а затем столкнитесь с проблемой.

Я создаю второй поток, у которого есть цикл для генерации источника данных, затем поток вызывает метод в MainPage для заполнения ListBoxItem.

Метод использует два способа сделать это.Одно использование привязки данных, а другое использование ListBoxItem SetContent ().

в результате привязка данных запускается около десятков циклов, а затем останавливается, но SetContent () может выполняться до конца.

основанные на полных кодах инструменты Windows Embedded Silverlight и выполняемые в 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>

Первое добавление

pWindowParameters->AllowsMultipleThreadAccess = true;

в App :: GetWindowParameters, если нет, SetContent () может выглядеть как DataBinding.

Объявить в MainPage.h

HRESULT MainPage::UpdateData();

и

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;

    }

};

В 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

такой результат:

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

Каков точный путь, еслиЯ хочу использовать DataBinding? Я хочу построить HMI, он может иметь сотни значений, а в 500 мс может обновлять десятки элементов.

Является ли SetContent () возможным способом использования в производственной среде?

1 Ответ

1 голос
/ 10 января 2012

Вам необходимо установить TPropertyBag напрямую. См MSDN

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

// Do this instead
pDataValue->SetValue(L"L1", &i)
...