数据绑定无法正常工作

时间:2014-05-05 01:35:28

标签: wpf xaml c++-cx

我在XAML中遇到数据绑定问题。我刚刚学习WPF,经过两天的研究,我想出了这段代码:

C ++ / CX:

namespace App1
{    
    class buttonColor {

    public:
        buttonColor(Windows::UI::Color c) { foreground = c; }

        Windows::UI::Color get() { return foreground; }

        void set(Windows::UI::Color c) { foreground = c; }

    private:
        Windows::UI::Color foreground;
    };
}

我称之为:

MainPage::MainPage()
{
    InitializeComponent();

    buttonColor t(Windows::UI::Colors::Blue);
}

XAML:

<Page.Resources>
    <CollectionViewSource x:Key="buttonColor" />
</Page.Resources>

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" DataContext="{StaticResource buttonColor}">

    <Button Content="Test" Foreground="{Binding Source=t}" />
</Grid>

这种作用:它确实将前景变为暗红色,但我无法控制颜色变化。有谁知道为什么这不会改变我在C ++ / CX代码中告诉它的颜色?

更新

我在GitHub上发布了我的完整代码:https://github.com/user2509848/wpf/tree/master。现在,我得到的是一个无法找到_foreColorProperty的链接错误。如果有人知道我做错了什么,请告诉我。

1 个答案:

答案 0 :(得分:1)

  • 使用Color代替画笔是一个常见的错误。
  • 您还应删除Source=或将其替换为Path=

所以而不是

<Button Content="Test" Foreground="{Binding t}" />

写:

<Button Content="Test"/>
    <Button.Foreground>
        <SolidColorBrush Color="{Binding t}"/>
    </Button.Foreground>
</Button>

被修改

您无法看到颜色变化的原因是您的财产未通知XAML有关更改。

在标题中:

public:
static property Windows::UI::Xaml::DependencyProperty^ ForeColorProperty
{
     Windows::UI::Xaml::DependencyProperty^ get()
     {
          return _foreColorProperty;
     }
}
public:
property Windows::UI::Color^ ForeColor
{
     Windows::UI::Color^ get()
     {
          return (Windows::UI::Color^)GetValue(ForeColorProperty);
     }
     void set(Windows::UI::Color^ value)
     {
          SetValue(ForeColorProperty, value);
     }
}

在CPP中:

DependencyProperty^ MainPage::_foreColorProperty = DependencyProperty::Register(
    "ForeColor",
    GetTypeName<Windows::UI::Color>(),
    GetTypeName<MainPage>(),
    ref new PropertyMetadata(nullptr));

然后使用"{Binding ForeColor}"绑定到此属性。

更多信息

每个DataContext

FrameworkElement值负责解析绑定路径。这意味着为了正确绑定,您应首先确保DataContext具有正确的值。 DataContext始终从其父级继承其值,这意味着如果将DataContext设置为MainPage,则除非明确设置,否则按钮的DataContext将等于它。

e.g。当您说<Button Foreground="{Binding t}">时,您的意思是将Button的前景设置为Button.DataContext.t

在此示例中,Button的DataContext应该等于MainPage的当前实例,因为我们为此父类型定义了_foreColorProperty:GetTypeName<MainPage>()

DependencyProperty^ MainPage::_foreColorProperty = DependencyProperty::Register(
    "ForeColor",
    GetTypeName<Windows::UI::Color>(),
--> GetTypeName<MainPage>(),
    ref new PropertyMetadata(nullptr));

但这还不够,你必须在MainPage的构造函数中设置它:

DataContext = this;

如果我们需要另一个类作为MainPage ViewModel ,我们应该创建另一个类并向其添加这些属性(并更改GetTypeName())然后

MyViewModelClass* vm = new MyViewModelClass();
DataContext = vm;