2013-05-13 2 views
1

Я читаю статью this на сайте MSDN, чтобы понять DataTrigger.Должно иметь ненулевое значение для 'Setter.Property'

Я создал класс DefaultViewModel, который выглядит следующим образом.

 namespace ControlTemplateDemo 
{ 
    public class DefaultViewModel 
    { 
     private List<ToDoItem> _list; 

     public DefaultViewModel() 
     { 
      _list = new List<ToDoItem>(); 
      _list.Add(new ToDoItem { TaskName="Wedding",Priority = 1,Description="Important wedding",TypeOfTask = TaskType.Home}); 
      _list.Add(new ToDoItem { TaskName = "Toyota Meeting", Priority = 3, Description = "WSR", TypeOfTask = TaskType.Work }); 
     } 

     public List<ToDoItem> Tasks 
     { 
      get { return _list; } 
     } 
    } 
} 

и мой код xamal выглядят следующим образом.

<Window x:Class="ControlTemplateDemo.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:ControlTemplateDemo" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 

    <DataTemplate DataType="{x:Type local:ToDoItem}"> 
     <Border BorderThickness="1" Name="myBorder" Margin="5" Padding="5" BorderBrush="Aqua"> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition/> 
        <RowDefinition/> 
        <RowDefinition/> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition/> 
        <ColumnDefinition/> 
       </Grid.ColumnDefinitions> 
       <TextBlock Text="Task Name" Grid.Row="0" Grid.Column="0"/> 
       <TextBlock Text="{Binding TaskName}" Grid.Row="0" Grid.Column="1"/> 

       <TextBlock Text="Description:" Grid.Row="1" Grid.Column="0"/> 
       <TextBlock Text="{Binding Description}" Grid.Row="1" Grid.Column="1" /> 

       <TextBlock Text="Priority:" Grid.Row="2" Grid.Column="0"/> 
       <TextBlock Text="{Binding Priority}" Grid.Row="2" Grid.Column="1"/>           
      </Grid> 
     </Border> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding Path=TypeOfTask}"> 
       <DataTrigger.Value> 
        <local:TaskType>Home</local:TaskType> 
       </DataTrigger.Value> 
       <Setter TargetName="myBorder" Property="Background" Value="Yellow" /> 
      </DataTrigger> 

      <MultiDataTrigger> 
       <MultiDataTrigger.Conditions> 
        <Condition Binding="{Binding Path=Priority}"> 
         <Condition.Value> 
          <sys:Int32>3</sys:Int32> 
         </Condition.Value> 
        </Condition> 
        <Condition Binding="{Binding Path=Description}"> 
         <Condition.Value> 
          <sys:String>WSR</sys:String> 
         </Condition.Value> 
        </Condition> 
       </MultiDataTrigger.Conditions> 
       <Setter> 
        <Setter.TargetName>myBorder</Setter.TargetName> 
        <Setter.Property>Background</Setter.Property> 
        <Setter.Value>Green</Setter.Value> 
       </Setter> 
      </MultiDataTrigger> 

     </DataTemplate.Triggers> 

    </DataTemplate> 

    <!--<local:DefaultViewModel x:Key="dvm"/>--> 
</Window.Resources> 
<Grid> 
    <StackPanel> 
     <TextBlock Name="blah" FontSize="20" Text="My To do tasks."/> 
     <ListBox x:Name="lstTasks" ItemsSource="{Binding Path=Tasks}" HorizontalContentAlignment="Stretch" > 
     </ListBox> 
    </StackPanel> 
</Grid> 

Qeustion/Проблема:
Я использую DataTemplate для Редер данных внутри ListBox. Мое намерение состоит в том, чтобы выделить фон границы (граница элемента списка) в зависимости от нескольких условий. например если TaskPriorty равно 3, а TaskDescription - «WSR», тогда я хочу выделить этот элемент списка с красным цветом. Однако, когда я запускаю это приложение, я получаю ошибку времени выполнения с сообщением ниже. Должно иметь ненулевое значение для 'Setter.Property'.

Может ли кто-нибудь помочь мне выяснить возникшую проблему? Без MultiDataTrigger все работает нормально.

Спасибо, Hemant

ответ

4

Используйте атрибут синтаксиса вместо Свойство элемента синтаксиса

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
    ... 
    </MultiDataTrigger.Conditions> 
    <Setter TargetName="myBorder" Property="Background" Value="Green"/> 
</MultiDataTrigger> 
+0

Большое спасибо. Работа как ожидалось. Это одна странная вещь в WPF, которая действительно затрудняет изучение. Я не знаю, почему синтаксис элемента свойства не работает в этом случае. – user2243747

+0

@ user2243747 Вы можете проверить MSDN, какой синтаксис разрешен. Сравните раздел синтаксиса [Setter.Value] (http://msdn.microsoft.com/en-us/library/system.windows.setter.value (v = vs.95) .aspx) и [Setter.Property] (http://msdn.microsoft.com/en-us/library/system.windows.setter.property(v=vs.95).aspx). Но хороший и простой подход - использовать атрибут синтаксиса всегда, когда это возможно. – lisp