WPF:數據綁定--數據模板介紹

DataTemplatingIntro數據模板介紹

實現效果:ide

  1. 列出任務項數據,由普通數據模板顯示通常信息,重要任務項則只顯示大寫文本描述。
  2. 若任務項的類型爲Home,由數據模板的邊框改變成黃色,其餘任務只大寫顯示文本
  3. 根據選定的任務項由數據模板展現其詳細信息

clipboard.png

clipboard.png

實踐:佈局

  1. DataTemplate.Triggers數據模板觸發器
  2. ItemTemplateSelector數據模板選擇器使用
  3. IsSynchronizedWithCurrentItem同步當前項

重要代碼:
ImportantTaskTemplate的模板以下:spa

<DataTemplate x:Key="ImportantTaskTemplate">
    <DataTemplate.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="FontSize" Value="20"/>
        </Style>
    </DataTemplate.Resources>
    <Border Name="border" BorderBrush="Red" BorderThickness="1"
      Padding="5" Margin="5">
        <DockPanel HorizontalAlignment="Center">
            <TextBlock Text="{Binding Path=Description}" />
            <TextBlock>!</TextBlock>
        </DockPanel>
    </Border>
</DataTemplate>

數據模板觸發器xaml代碼
DataTrigger-Binding-Value--Settercode

<DataTemplate.Triggers>
    <DataTrigger Binding="{Binding Path=TaskType}">
        <DataTrigger.Value>
            <local:TaskType>Home</local:TaskType>
        </DataTrigger.Value>
        <Setter TargetName="border" Property="BorderBrush" Value="Yellow"/>
    </DataTrigger>
</DataTemplate.Triggers>

界面xamlorm

<StackPanel>
    <TextBlock FontSize="20" Text="My Task List:"/>
    <ListBox Width="400" Margin="10"
         ItemsSource="{Binding Source={StaticResource MyTodoList}}"
         ItemTemplateSelector="{StaticResource MyDataTemplateSelector}"
         HorizontalContentAlignment="Stretch" 
         IsSynchronizedWithCurrentItem="True"/>
    <TextBlock FontSize="20" Text="Information:"/>
    <ContentControl Content="{Binding Source={StaticResource MyTodoList}}"
                ContentTemplate="{StaticResource MyTaskTemplate}"/>
</StackPanel>

選擇器繼承DataTemplateSelector類
業務邏輯:若是任務重要性等於1,則加載指定重要模板資源,不然加載通常資源對象

public class TaskListDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate
        SelectTemplate(object item, DependencyObject container)
    {
        if (item != null && item is Task)
        {
            var taskitem = (Task) item;
            var window = Application.Current.MainWindow;
            if (taskitem.Priority == 1)
                return
                    window.FindResource("ImportantTaskTemplate") as DataTemplate;
            return
                window.FindResource("MyTaskTemplate") as DataTemplate;
        }

        return null;
    }
}

擴展:
DataTemplateSelector 類:繼承

  1. 若要建立模板選擇器,請建立繼承自 DataTemplateSelector 的類並重寫 SelectTemplate 方法。 在定義您的類後,就能夠將類的實例分配到您的元素的模板選擇器屬性。
  2. 請注意,若是具備不一樣類型的對象,則能夠對 DataTemplate 設置 DataType 屬性。 若是您執行了此操做,則無需建立 DataTemplateSelector。
  3. 此外,若是對象類型相同但屬性不一樣,也能夠考慮使用 DataTrigger 或數據轉換器。

ItemsControl.ItemTemplateSelector 屬性:ip

  1. 使用 ItemContainerStyle 屬性或 ItemContainerStyleSelector 屬性來設置樣式,以影響包含數據項的元素的外觀。 例如,對於 ListBox,生成的容器是 ListBoxItem 控件;對於 ComboBox,它們是 ComboBoxItem 控件。
  2. 若要影響項的佈局,請使用 ItemsPanel 屬性。 若是在控件上使用分組,能夠使用 GroupStyle 或 GroupStyleSelector 屬性。
相關文章
相關標籤/搜索