WPF DataTrigger / DataBinding не работает? - PullRequest
3 голосов
/ 29 марта 2011

РЕДАКТИРОВАТЬ: Итак, оказалось, что это была проблема с кодом в виртуальной машине (достаточно неловко проверка свойства, которое всегда возвращало true [после сеанса рефакторинга]) - я бы предположил, что Я запутался в привязке данных, так как это обычный подозреваемый (по крайней мере, для меня)
Спасибо за помощь и извинения за потраченное время.

Привет, я пытаюсь заставить это просто изменить цвет текста на красный или зеленый в зависимости от логического свойства зависимости в viewmodel. Триггеры, где проблема ... Я думаю?

 <TextBlock>
    <TextBlock.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsNegativeChange}" Value="true">
                     <Setter Property="TextBlock.Foreground" Value="Red" />
                 </DataTrigger>

                 <DataTrigger Binding="{Binding IsNegativeChange}" Value="false">
                      <Setter Property="TextBlock.Foreground" Value="Green" />
                  </DataTrigger>
             </Style.Triggers>
         </Style>
     </TextBlock.Style>

    <TextBlock.Text>
         <MultiBinding StringFormat="{}{0} ({1})">
            <Binding Path="ReturnedData.Change" />
            <Binding Path="ReturnedData.ChangePercentage" />
          </MultiBinding>
    </TextBlock.Text>
 </TextBlock>

IsNegativeChange является членом самого объекта ViewModel, поэтому ему не требуется квалификация ReturnedData.

В таком виде текст всегда отображается зеленым цветом. ViewModel правильно возвращает истину / ложь в зависимости от ввода. Помогите! Что-то глупое, что мне не хватает?

[отредактировано для форматирования]

Edit, в окне отладки написано:

BindingExpression: Path = IsNegativeChange; DataItem = NULL; целевым элементом является TextBlock (Name = ''); целевое свойство равно «NoTarget» (тип «Объект»)

Разве цель не установлена ​​??

Ответы [ 3 ]

1 голос
/ 29 марта 2011

Триггеры выглядят нормально для меня, в окне вывода в Visual Studio отображаются ошибки привязки?

Если нет, возможно, это тот случай, когда значение триггера перезаписывается, см. Эту статью о приоритете значения свойства зависимости для получения дополнительной информации. Если вы установите значение явно зеленым, триггер не будет ничего делать.

0 голосов
/ 29 марта 2011

Я думаю, что вашей проблемой может быть стиль, встроенный в элемент.Сообщение об ошибке Binding в вашей консоли указывает, что цель привязки скрыта в вашем стиле.Тем не менее, вы упоминаете, что добавление другого элемента Label с привязкой показывает правильное значение.

Я бы также рассмотрел возможность преобразования в известный стиль в вашем стиле вместо двух противоположных триггеров.

Попробуйте определитьстиль вне TextBlock -

<Grid>
    <Grid.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Style.Triggers>
                 <Setter Property="TextBlock.Foreground" Value="Green" />
                 <DataTrigger Binding="{Binding IsNegativeChange}" Value="True">
                      <Setter Property="TextBlock.Foreground" Value="Red" />
                  </DataTrigger>
             </Style.Triggers>
         </Style>
    </Grid.Resources>
    <TextBlock>
         <TextBlock.Text>
             <MultiBinding StringFormat="{}{0} ({1})">
                 <Binding Path="ReturnedData.Change" />
                 <Binding Path="ReturnedData.ChangePercentage" />
             </MultiBinding>
         </TextBlock.Text>
    </TextBlock>
</Grid>

Надеюсь, это поможет!

0 голосов
/ 29 марта 2011

Вы, вероятно, можете покончить со вторым триггером следующим образом:

<Style>
    <Setter Property="TextBlock.Foreground" Value="Red" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=DataContext.IsNegativeChange}" Value="false">
            <Setter Property="TextBlock.Foreground" Value="Green" />
        </DataTrigger>
    </Style.Triggers>
</Style>

Это не объясняет, почему одно работает, а другое - нет.

...