2015-07-27 4 views
2

У меня есть этот WPF структура:Элементы управления привязкой данных не работают?

<UserControl 
     xmlns:viewModel="clr-namespace:..ViewModel.ToneAudiogramLegend"> 
     ... 
    <DataTemplate DataType="{x:Type viewModel:ToneAudiogramLegendTableViewModel}"> 
     ... 

    <DataGrid Grid.Row="1" Grid.Column="0" ItemsSource="{Binding ToneAudiogramLegneds}" HeadersVisibility="None" AutoGenerateColumns="False" IsReadOnly="True" BorderBrush="Transparent" BorderThickness="0" 
            MinWidth="100" Height="{Binding Height, Mode=OneWay}" KeyboardNavigation.DirectionalNavigation="None" Grid.ColumnSpan="6" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" GridLinesVisibility="None" ColumnWidth="*" 
            Margin="1" wpfmvvm:DataGridRowHeightBehaviour.AutoFitRowHeight="True" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"> 
          <DataGrid.Columns> 
           <DataGridTemplateColumn HeaderTemplate="{x:Null}"> 
            <DataGridTemplateColumn.CellTemplate> 
             <DataTemplate> 
              <Label x:Name="PART_Content" Content="{Binding Path=Left.Content}" 
              HorizontalAlignment="Center" VerticalAlignment="Center" 
              Foreground="Gold"/> 

              <DataTemplate.Triggers> 
                <DataTrigger Binding="{Binding Path=IsMonochrome}" Value="True"> 
                <Setter TargetName="PART_Content" Property="Foreground" Value="Green"/> 
                </DataTrigger> 
              </DataTemplate.Triggers> 
             </DataTemplate> 
            </DataGridTemplateColumn.CellTemplate> 
           </DataGridTemplateColumn> 
    ... 
    <DataTemplate> 

связывание Value работ, потому что цвет получает значение по умолчанию Left.Color из <Setter Property="Foreground" Value="{Binding Path=Left.Color}"/>

Свойство IsMonochrome изменяет значение, когда происходит определенное событие, но на первый план цвет не меняется на зеленый. Я не совсем уверен, что формат и структура уместны. Я не уверен, что если <DataTemplate> является проблемой, так как у меня есть еще один <DataTemplate> в более высокого порядка

Классы:

public partial class ToneAudiogramLegendTableViewModel : ViewModelBase, IToneAudiogramLegendTableViewModel, IHandleMonochromeReportElement 
{ 
    public bool IsMonochrome 
      { 
       get { return GetValue<bool>("IsMonochrome"); } 
       private set { SetValue("IsMonochrome", value); } 
      } 

      public void SwitchToMonochromeMode() 
      { 
       IsMonochrome = true; 
      } 

      public void SwitchToColorMode() 
      { 
       IsMonochrome = false; 
      } 
} 

и

public class ToneAudiogramLegendViewModel : ViewModelBase, IToneAudiogramLegendVM 
    { 
     public string Name 
     { 
      get { return GetValue<string>("Name"); } 
      set { SetValue("Name", value); } 
     } 

     public LegendViewModel Left 
     { 
      get { return GetValue<LegendViewModel>("Left"); } 
      set { SetValue("Left", value); } 
     } 
} 

и

public class LegendViewModel : ViewModelBase 
    { 
     public object Content 
     { 
      get { return GetValue<object>("Content"); } 
      set { SetValue("Content", value); } 
     } 

     public Brush Color 
     { 
      get { return GetValue<Brush>("Color"); } 
      set { SetValue("Color", value); } 
     } 

     public LegendViewModel(object content, Brush color) 
     { 
      Content = content; 
      Color = color; 
     } 
    } 

Что может проблема?

ответ

2

В вашем CellTemplate вы привязываетесь к объекту ToneAudiogramLegendViewModel, где находятся свойства Name и Left. IsMonochrome находится на другом объекте, поэтому он не работает.

Вам необходимо определить свойство IsMonochrome, или вам нужно создать свойство для ссылки ToneAudiogramLegendTableViewModel в ToneAudiogramLegendViewModel, чтобы иметь возможность привязывать данные к IsMonochrome.

EDIT: на основе ваших комментариев:

<DataTrigger Binding="{Binding Path=DataContext.IsMonochrome, 
           RelativeSource={RelativeSource DataGrid}}" 
      Value="True"> 
+0

Использование этикеток работ, так как содержимое отображается, как это было с ContentPresenter. Однако DataTrigger не работает. Я просто увидел, что, поскольку DataTemplate не ссылался на мой класс C#, на isMonochrome нельзя ссылаться (я тестировал с помощью предложений Path). Несмотря на то, что я ссылался на него, он по-прежнему не может изменить цвет при возникновении события. Могу ли я проверить это вручную вместо привязки? Я просто хочу проверить, работает ли datatrigger. Я чувствую, что он никогда не видит '', а только значение по умолчанию, указанное в 'Path = LeftColor' – ot0

+0

1. можете ли вы проверить окно вывода в visual studio во время отладки, если есть какие-либо ошибки привязки? 2. Удалите привязку переднего плана с метки и оставьте триггер, чтобы изолировать проблему. – Liero

+0

3. Где определено свойство IsMonochrome? это тот же объект, где определено свойство 'Left'? возможно, вам нужен '{Binding Path = Left.IsMonochrome}' в вашем datatrigger – Liero

Смежные вопросы