2017-07-16 6 views
0

私が気付いたデータテンプレートについて読んでいるうちに、データの種類に基づいて異なるテンプレートを選択できます。 - しかし、別ののコンテンツののためにこれを行うことができますか?データの機能/内容に基づいて異なる要素にデータをバインドする

私のmodelviewは、データのリストを提供します。原則として、それは単にTuple<ImageData, AltText>でタプル(カスタムクラスにバインドされて入力を簡単にする)のリストです。 のModelViewのプロパティのタイプは次のとおりです。

ReadOnlyObservableCollection<ThumbDispData> 

ThumbDispDataで:

public class ThumbDispData 
{ 
    public ImageData Idhl { get; set; } 
    public string AltText { get; set; } 
} 

は今、私はそれが(ImageData.Sourceが非ヌルである)ことができればImageを表示したい - それ以外の場合は、表示されるはずです代替テキスト。

XAMLまたはUserControl:

<UserControl x:Class="test.ThumbPanel" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:test="clr-namespace:test" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <UserControl.Resources> 
     <DataTemplate DataType="{x:Type test:ThumbDispData}"> 
      <TextBlock Text="{Binding AltText}"></TextBlock> 
     </DataTemplate> 
    </UserControl.Resources> 
    <Grid Background="Transparent"> 
     <ItemsControl ItemsSource="{Binding}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <WrapPanel IsItemsHost="True" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
    </Grid> 
</UserControl> 

まあのみ上記はALTテキスト(作品を)示しています。どのように私はThumbDispDataの内容に基づいて、セレクタを作成します。

答えて

1

あなたが使用することができDataTemplateSelector

<UserControl.Resources> 
    <DataTemplate x:Key="tt" DataType="{x:Type test:ThumbDispData}"> 
     <TextBlock Text="{Binding AltText}"></TextBlock> 
    </DataTemplate> 
    <DataTemplate x:Key="img" DataType="{x:Type test:ThumbDispData}"> 
     <Image Source="{Binding Idhl}" /> 
    </DataTemplate> 
    <local:Selector x:Key="selector" TextTemplate="{StaticResource tt}" ImageTemplate="{StaticResource img}" /> 
</UserControl.Resources> 
<Grid Background="Transparent"> 
    <ItemsControl ItemsSource="{Binding}" ItemTemplateSelector="{StaticResource selector}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel IsItemsHost="True" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 
</Grid> 

public class Selector : DataTemplateSelector 
{ 
    public DataTemplate ImageTemplate { get; set; } 
    public DataTemplate TextTemplate { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     ThumbDispData data = item as ThumbDispData; 
     if (data != null && data.Idhl != null) 
      return ImageTemplate; 


     return TextTemplate; 
    } 
} 
0

私はThumbDispDataの内容に基づいてセレクタを作成します。

あなたは通常、あなたがIdhlプロパティをチェックし、それがnullだかどうかに応じて、別のテンプレートオブジェクトを返している、DataTemplateSelectorのサブクラスを書くでしょう。通常、テンプレートはリソースであり、セレクタで動的にロードします。

しかし、あなたのシナリオは、私がスタイルを代わりに使うほど簡単です。たとえば:

<DataTemplate DataType="{x:Type test:ThumbDispData}" 
    xmlns:p="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
    <Grid> 
    <TextBlock Text="{Binding AltText}"> 
     <TextBlock.Style> 
     <p:Style TargetType="TextBlock"> 
      <Setter Visibility="Visible"/> 
      <p:Style.Triggers> 
      <DataTrigger Binding="{Binding Idhl}" Value="{x:Null}"> 
       <Setter Visibility="Collapsed"/> 
      </DataTrigger> 
      </p:Style> 
     </p:Style> 
     </TextBlock.Style> 
    </TextBlock> 
    <Image Source="{Binding Idhl}"> 
     <Image.Style> 
     <p:Style TargetType="Image"> 
      <Setter Visibility="Collapsed"/> 
      <p:Style.Triggers> 
      <DataTrigger Binding="{Binding Idhl}" Value="{x:Null}"> 
       <Setter Visibility="Visible"/> 
      </DataTrigger> 
      </p:Style> 
     </p:Style> 
     </Image.Style> 
    </Image> 
    </Grid> 
</DataTemplate> 

注:それはデフォルト値なので

  • は、厳密に言えば、あなたは、TextBlockスタイルで<Setter Visibility="Visible"/>を必要としません。私は2つの要素のスタイル間の対称性を文書化するのに役立つので、そこに置きます。
  • XMLフォーマッタはXAML Style要素を正しく処理しないため、xmlns:p宣言はスタックオーバーフローの回避策としてのみ存在します。実際のXAMLでは、そのまま残して、p:Styleの代わりにStyleの名前を直接使用することができます。
+0

私はこのようなアプローチを持っている最大の問題は、あなたが跳躍する前に見ているということです。イメージデータは本質的に揮発性です(ソースは壊れている/ 'Image'クラスが表示できないフォーマットを表しているかもしれません)ので、' Image'がソースを表示できる場合にのみデータトリガの方法はありませんか? – paul23

+0

_ "Imageがソースを表示できるのであれば、データトリガの手段はありませんか?"しかし、あなたの質問はその具体的な例を提供するのに十分な文脈を提供していません。上記の例では、プロパティに対してユーザー定義型の 'ImageData'を使用していることを考慮していないことに注意してください。実際のコードでは 'Idhl'に直接バインドすることには疑問があります。イメージソースを別のタイプにラップしているようです。 –

+0

しかし、基本的な考え方は同じです。データが有効かどうかを示す_some_プロパティをトリガし、有効な画像ソース(データが無効の場合はおそらく 'null ')に' Source'プロパティをバインドします。 –

関連する問題