WPF TextBlock绑定到DependencyProperty

时间:2009-06-03 17:42:08

标签: wpf data-binding dependency-properties

我认为这是关于尝试将视图绑定到视图模型中的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";

我从未收到要显示的测试消息。

5 个答案:

答案 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>