0

很抱歉给您阅读我的问题带来了很多麻烦,因为我是中国人,我的英语很差,但是这个问题一直困扰着我。

当我构建有关数据绑定的测试代码时,遇到了麻烦。

我创建了第二个线程,它有一个循环来生成 data-source ,然后线程调用 MainPage 中的一个方法来填充 ListBoxItem。

该方法使用两种方法来做到这一点。一个使用数据绑定,另一个使用 ListBoxItem 的 SetContent()。

结果是数据绑定运行了大约几十个周期然后停止,但 SetContent() 可以运行完成。

以下是我基于 Windows Embedded Silverlight Tools 的全部代码,并在 CEPC 中运行

主页.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);

数据值.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() 是可以在生产环境中使用的可行方法吗?

4

1 回答 1

1

您需要直接设置 TPropertyBag。见MSDN

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

// Do this instead
pDataValue->SetValue(L"L1", &i)
于 2012-01-10T05:50:19.493 回答