2016-02-24 3 views
0

Цель Моя цель состоит в том, чтобы загрузить элемент управления в GridView строке на основании свойства в ViewModel.Binding вопрос по DataTrigger в DataTemplate - WPF

Образец кода: Вот образец xaml, который я пробовал.

<ListView Margin="10" Name="lvUsers"> 
    <ListView.View> 
     <GridView x:Name="gridview"> 
      <GridViewColumn Header="Type"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <ContentControl> 
          <ContentControl.Style> 
           <Style TargetType="{x:Type ContentControl}"> 
            <Style.Triggers> 
             <DataTrigger Binding="{Binding IsImage}" Value="True"> 
              <Setter Property="ContentTemplate"> 
               <Setter.Value>               
                <DataTemplate> 
                 <TextBlock Text="Text goes here" 
                Foreground="Red"/> 
                </DataTemplate> 
               </Setter.Value> 
              </Setter> 
             </DataTrigger> 

             <DataTrigger Binding="{Binding IsImage}" Value="False"> 
              <Setter Property="ContentTemplate"> 
               <Setter.Value> 
                <DataTemplate> 
                 <TextBlock Text="{Binding Itemsource}"/> 

                </DataTemplate> 
               </Setter.Value> 
              </Setter> 
             </DataTrigger> 
            </Style.Triggers> 
           </Style> 
          </ContentControl.Style> 
         </ContentControl> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 

     </GridView> 
    </ListView.View> 
</ListView> 

И мой образец xaml.cs код

public partial class MainWindow : Window 
{  
    public MainWindow() 
    { 
     InitializeComponent();    
     List<myClass> mc = new List<myClass>(); 
     mc.Add(new myClass() { Itemsource = "test", IsImage = false }); 
     mc.Add(new myClass() { Itemsource = "test", IsImage = true }); 
     lvUsers.ItemsSource = mc; 
    }  
} 

class myClass 
{ 
    public string Itemsource { get; set; } 
    public bool IsImage { get; set; } 
} 

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

<TextBlock Text="{Binding Itemsource}"/> 

Я ожидал приведенную выше строку для отображения test в соответствующей строке, но она отображает Empty r вл.

+0

".. на основе собственности в viewmodel." У вас нет ViewModel – Tyress

+0

@Tyress Это всего лишь образец кода, чтобы сделать его простым и лучше понять проблему. Фактический код отличается от этого, где у меня есть виртуальная виртуальная машина. – Gopichandar

ответ

1

Не удалось выяснить, почему DataContext TextBlock имеет значение NULL. Вероятно, это связано с шаблоном пользовательского контента. Но как вы можете это исправить, ища тип предка ContentControl, как это.

<DataTrigger Binding="{Binding IsImage}" Value="False"> 
    <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <TextBlock Text="{Binding DataContext.Itemsource, RelativeSource={RelativeSource FindAncestor, AncestorType=ContentControl}}"/> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</DataTrigger> 

Это позволит получить данные из привязки данных родительских элементов управления.

Редактировать

Это из-за ContentControl, что вам нужно сделать обязательным, как содержание - <ContentControl Content="{Binding}">. Тогда контекст данных будет доступен как есть, и будет работать <TextBlock Text="{Binding Itemsource}"/>.

<ContentControl Content="{Binding}"> 
    <ContentControl.Style> 
     <Style TargetType="{x:Type ContentControl}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsImage}" Value="True"> 
        <Setter Property="ContentTemplate"> 
         <Setter.Value>               
          <DataTemplate> 
           <TextBlock Text="Text goes here" 
          Foreground="Red"/> 
          </DataTemplate> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 

       <DataTrigger Binding="{Binding IsImage}" Value="False"> 
        <Setter Property="ContentTemplate"> 
         <Setter.Value> 
          <DataTemplate> 
           <TextBlock Text="{Binding Itemsource}"/> 

          </DataTemplate> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 
+0

Работы. Позвольте мне посмотреть на какое-то время, получим ли мы точный вопрос, прежде чем принимать это. – Gopichandar

+0

Можете ли вы рассказать мне, где он должен быть привязан. Пробовал 'Binding' в' ContentControl'. Не повезло – Gopichandar

+1

Если это так, знаете ли вы, как 'Datatriggers' внутри' ContentControl' работал так, как ожидалось? – Gopichandar

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