Привязка текстового блока WPF к DependencyProperty - PullRequest
1 голос
/ 03 июня 2009

У меня есть то, что я считаю одним из самых простых случаев попытки связать представление со свойством зависимости в модели представления. Кажется, что первоначальные изменения отражаются в представлении, но другие изменения в DP не обновляют TextBlock представления. Я, наверное, просто упускаю что-то простое, но я просто не вижу, что это такое. Пожалуйста, посмотрите ...

Мой XAML имеет строку состояния в нижней части окна. Я хочу привязать к ДП "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>

Для моей модели представления определен 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...";

Есть ли здесь что-то очевидное, чего мне не хватает? В моем конструкторе для модели представления я установил DP следующим образом:

        VRAStatus = "Ready";

Я никогда не получаю тестовое сообщение для отображения.

Ответы [ 5 ]

4 голосов
/ 04 ноября 2010

Вам необходимо добавить DataContext = "{Binding RelativeSource = {RelativeSource Self}} в.

1 голос
/ 06 июня 2009

Как оказалось, все оказалось немного сложнее, чем я думал (например, когда это НЕ так :) Мой RibbonControl был в UserControl, чтобы получить весь этот XAML из MainWindow. Именно тот факт, что он был в UserControl, заставлял его работать с ViewModel по-другому. Я не знаю почему - возможно, одна из тех загадок, которые никогда не будут раскрыты. Но, поместив мой RibbonControl непосредственно в MainWindow, все работает как положено - и с DP, и со свойством C #. Интересно. (Хотел бы я вернуться в эти два дня моей жизни!)

спасибо, Билл

0 голосов
/ 06 апреля 2010

Попробуйте указать свойство 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>
0 голосов
/ 04 июня 2009

Bill

Когда и где вы устанавливаете DataContext? В прошлом у меня были проблемы: когда я устанавливал DataContext перед InitializeComponent, мои привязки никогда не выполнялись должным образом.

Кроме того, ради любопытства: почему вы используете DP в своей ViewModel вместо просто Property?

0 голосов
/ 03 июня 2009

Попробуйте указать имя DP с флагом Path в привязке следующим образом:

<TextBlock x:Name="statusBar" Text="{Binding Path=VRAStatus}">
...