我在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
的链接错误。如果有人知道我做错了什么,请告诉我。
答案 0 :(得分:1)
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;