如何将C ++函数绑定到xaml文本文本块属性

时间:2016-05-30 16:39:29

标签: c++ xaml binding uwp

我必须学会在UWP上编码(这是我在Windows 10和VS的第一步),所以我尝试做一些非常基本的事情:从某些C ++函数中更改文本块。

从技术上讲,我的项目非常简单:我开了一个新的visual C ++> Windows>通用>空白App 我在MainPage.xaml中添加了一个文本块:

<Page
    x:Class="App4.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App4"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <TextBlock x:Name="textBlock" HorizontalAlignment="Left" Margin="49,46,0,0" TextWrapping="Wrap" Text="WHAT I WANT TO BIND" VerticalAlignment="Top"/>

    </Grid>
</Page>

我试图找出如何绑定文本块。我尝试了几种方法,都失败了。例如,我添加了一个类TestBindMe:

TestBindMe.h

#pragma once
namespace App4
{

ref class TestBindMe sealed
{
public:
    TestBindMe();
    property Platform::String^ MySuperString
    {
        Platform::String^ get() {
            return this->mySuperString_;
        }
    }

private:
    Platform::String^ mySuperString_;
};

};

TestBindMe.cpp

#include "pch.h"
#include "TestBindMe.h"

namespace App4
{

TestBindMe::TestBindMe()
{
}

};

我在为Text="WHAT I WANT TO BIND"

编辑Text={x:Bind TestBindMe.get}后尝试构建它

我得到了那个输出:

1>------ Build started: Project: App4, Configuration: Debug Win32 ------
1>  App.xaml.cpp
1>  MainPage.xaml.cpp
1>  TestBindMe.cpp
1>c:\users\user\documents\visual studio 2015\projects\app4\app4\testbindme.cpp(1): fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "pch.h"' to your source?
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
========== Deploy: 0 succeeded, 0 failed, 0 skipped ==========

1 个答案:

答案 0 :(得分:1)

正如Clemens所说, {x:Bind} 使用页面或用户控件本身作为默认来源。

  

它将查看页面或用户控件的代码隐藏属性,字段和方法。要将视图模型公开为 {x:Bind} ,您通常需要为页面或用户控件的后台代码添加新字段或属性。属性路径中的步骤由点(。)分隔,并且您可以包含多个分隔符以遍历连续的子属性。无论用于实现绑定对象的编程语言如何,都使用点分隔符。

因此,我们可以在MainPage的{​​{1}}代码隐藏中添加一个属性。请注意

  

对于C ++ / CX, {x:Bind} 无法绑定到页面或数据模型中的私有字段和属性 - 您需要具有公共属性才能使其可绑定。

有关详细信息,请参阅{x:Bind} markup extension

所以我改变了你的 TestBindMe.h ,如下面的

{x:Bind}

MainPage.xaml.h 中,添加一个名为&#34; ViewModel&#34;的公共属性。其类型为namespace App4 { public ref class TestBindMe sealed { public: TestBindMe(); property Platform::String^ MySuperString { Platform::String^ get() { return this->mySuperString_; } } private: Platform::String^ mySuperString_ = "My Bind Test"; }; }

TestBindMe

然后在 MainPage.xaml.cpp 中,初始化#include "MainPage.g.h" #include "TestBindMe.h" namespace App4 { /// <summary> /// An empty page that can be used on its own or navigated to within a Frame. /// </summary> public ref class MainPage sealed { public: MainPage(); property App4::TestBindMe^ ViewModel; }; }

ViewModel

在此之后,我们可以在XAML中使用MainPage::MainPage() { InitializeComponent(); ViewModel = ref new TestBindMe(); } ,例如{x:Bind}

这是一个简单的示例,您可以在GitHub上找到官方x:Bind sample