1
我正在閱讀MSDN站點上的this文章,以便理解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到REDER內部列表框數據。我的意圖是根據多個條件突出顯示邊框的背景(列表項的邊框)。例如如果TaskPriorty爲3並且TaskDescription爲'WSR',那麼我想用紅色突出顯示該列表項目。但是,當我運行這個應用程序時,我得到運行時錯誤與下面的消息。 'Setter.Property'必須具有非空值。
任何人都可以幫我找出問題嗎?沒有MultiDataTrigger的一切工作正常。
感謝, 與Hemant
非常感謝你。按預期工作。這是WPF中的一個奇怪的事情,它確實使其難以學習。我不知道爲什麼Property元素語法在這種情況下不起作用。 – user2243747 2013-05-13 08:35:08
@ 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 2013-05-13 08:47:25