我认为这是关于尝试将视图绑定到视图模型中的dependencyproperty的最简单情况之一。似乎初始更改反映在视图中,但DP的其他更改不会更新视图的TextBlock。我可能只是错过了一些简单的东西,但我只是看不出它是什么。请看看......
我的XAML在窗口底部有一个状态栏。我想绑定到DP“VRAStatus”。
<StatusBar x:Name="sbar" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2"
VerticalAlignment="Bottom" Background="LightBlue" Opacity="0.4" DockPanel.Dock="Bottom" >
<StatusBarItem>
<TextBlock x:Name="statusBar" Text="{Binding VRAStatus}" />
</StatusBarItem>
<StatusBarItem>
<Separator Style="{StaticResource StatusBarSeparatorStyle}"/>
</StatusBarItem>
</StatusBar>
我的viewmodel定义了DP:
public string VRAStatus
{
get { return (string)GetValue(VRAStatusProperty); }
set { SetValue(VRAStatusProperty, value); }
}
// Using a DependencyProperty as the backing store for VRAStatus.
public static readonly DependencyProperty VRAStatusProperty =
DependencyProperty.Register("VRAStatus", typeof(string), typeof(PenskeRouteAssistViewModel),new PropertyMetadata(string.Empty));
然后,在我的代码中,我设置了DP:
VRAStatus = "Test Message...";
这里有什么明显的东西让我失踪吗?在我的viewmodel构造函数中,我将DP设置为:
VRAStatus = "Ready";
我从未收到要显示的测试消息。
答案 0 :(得分:4)
您需要在中添加DataContext =“{Binding RelativeSource = {RelativeSource Self}}。
答案 1 :(得分:1)
事实证明事情比我想象的要复杂得多(比如,什么时候不是这样)我的RibbonControl在UserControl中将所有XAML从MainWindow中取出。事实上,它在UserControl中使它与ViewModel的工作方式不同。我不知道为什么 - 可能是那些永远无法解决的谜团之一。但是通过将我的RibbonControl直接放在MainWindow上,一切都按预期工作 - 包括DP和C#属性。有趣。 (希望我能回到我生命中的那两天!)
感谢, 比尔
答案 2 :(得分:0)
尝试使用绑定中的Path标志指定DP的名称,如下所示:
<TextBlock x:Name="statusBar" Text="{Binding Path=VRAStatus}">
答案 3 :(得分:0)
比尔,
您何时何地设置DataContext?我在过去遇到过问题,当我在InitializeComponent之前设置DataContext时,我的Bindings从未正确执行。
另外,出于好奇心的缘故:为什么在ViewModel中使用DP而不仅仅是属性?
答案 4 :(得分:0)
尝试指定Binding的UpdateSourceTrigger属性:
<StatusBar x:Name="sbar" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2"
VerticalAlignment="Bottom" Background="LightBlue" Opacity="0.4" DockPanel.Dock="Bottom" >
<StatusBarItem>
<TextBlock x:Name="statusBar" Text="{Binding VRAStatus, UpdateSourceTrigger=PropertyChanged}" />
</StatusBarItem>
<StatusBarItem>
<Separator Style="{StaticResource StatusBarSeparatorStyle}"/>
</StatusBarItem>
</StatusBar>