2016-04-27 6 views
1

私は複数のDataTemplatesでListViewを持っていますが、これが正しい方法であるかどうかはわかりません。私のXAMLは、次のようになります。継承を持つListView.Resourcesの複数のDataTemplates?

<ListView.Resources> 
    <DataTemplate x:Key="ParentClass" x:DataType="local:ParentClass"> 
     <!-- The Template --> 
    </DataTemplate> 
    <DataTemplate x:Key="ChildClass" x:DataType="local:ChildClass"> 
     <!-- The Template --> 
    </DataTemplate> 
</ListView.Resources> 

そして、私のクラスには、次のようになります。

class ParentClass {} 
class ChildClass: ParentClass {} 

どのようにオブジェクトがChildClassない場合にのみ、これはParentClassテンプレートを取ることを確認することができますか?私はそれらを特別な順序で入れる必要がありますか?これはXAMLでは不可能ですか?また、問題を完全に回避するために2番目の「ダミー」の子クラスを作成する必要がありますか?

+1

あなた、あなたはDataTemplateSelectorを実装します。このリンクを参照してくださいhttp://stackoverflow.com/questions/25747924/wp-8-1-datatemplateselector-isnt-working – Archana

+1

私はそれが問題ではないことがわかりました。それは定義の順序に関係なくできる最も特殊なテンプレートを使用します。 –

+0

@EdPlunkettあなたがそのソースを見つけることができれば、それを回答として掲示して受け入れます。 – vrwim

答えて

1

かいつまんで、WindowsのユニバーサルアプリDataTemplate.DataTypeをサポートしていないので、Windowsのユニバーサルアプリ、x:Keyせずにリソースディクショナリで宣言することはできませんがデータ型のデフォルトのテンプレートをサポートしていません。 x:DataType添付プロパティWPFで何をDataTypeしません。

Windowsユニバーサルアプリケーションでは、ItemsControl.ItemTemplateなどの値としてDataTemplateのインラインを定義するか、x:Keyというリソースディクショナリで定義できます。テンプレートを選択する場合は、DataTemplateSelectorと記述する必要があります。

あなたの質問では、テンプレートを定義していますが、誰もそれらを使用していません。

これはまあまあです。これは、WPFに適用される私のオリジナルの答えだった

WPFは異なっています。 Windows Universal Appsには該当しませんが、これはこの質問の実際の範囲です。タグの中にはwin-universal-appと書かれていますが、タグを読み取っていませんでした。それが正しい限りで、誰かをこのページに導く質問への答えになる可能性があるので、私はメタを質問しながらこれをここに置いておきます。

A DataTemplate without an x:Key property is applied to any object of the appropriate type。親クラスとサブクラスに別々のデータテンプレートがある場合、それは可能な最も特殊なテンプレートを使用します。 MSDN notes that it's similar to Style.TargetTypeTargetType="{x:Type Button}"の既定のスタイルがButtonBaseの既定のスタイルを自動的にオーバーライドしなかった場合を想像してください。 カオスが続くだろう!私はこれを明示的に述べている文書を見つけることさえできません。そして、Brian Kernighanが言ったように、 "あなたのコンパイラは言語の最終的な権威です":それは私が書いた簡単なテストで私のために動作する方法です。

DataTemplateの定義の順序を逆にすると、同じように動作します。また、ItemSubClassDataTemplateの定義をWindow.Resourcesに移動すると、同じように動作します。

XAML:

<ItemsControl 
    ItemsSource="{Binding Items}" 
    BorderBrush="Black" 
    BorderThickness="1" 
    Margin="4" 
    > 
    <ItemsControl.Resources> 
     <DataTemplate DataType="{x:Type local:ItemSubClass}"> 
      <Grid Background="Beige"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="1*" /> 
        <ColumnDefinition Width="1*" /> 
       </Grid.ColumnDefinitions> 
       <TextBlock 
        Grid.Column="0" 
        Text="{Binding Name, StringFormat=Name: {0}}" 
        /> 
       <TextBlock 
        Grid.Column="1" 
        Text="{Binding Category, StringFormat=Category: {0}}" 
        /> 
      </Grid> 
     </DataTemplate> 

     <DataTemplate DataType="{x:Type local:Item}"> 
      <TextBlock Text="{Binding Name, StringFormat=Name: {0}}" /> 
     </DataTemplate> 
    </ItemsControl.Resources> 
</ItemsControl> 

C#:

public class Item : INotifyPropertyChanged 
{ 
    private string _name = ""; 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      OnPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged([CallerMemberName] String propName = null) 
    { 
     PropertyChanged?.Invoke(this, 
        new PropertyChangedEventArgs(propName)); 
    } 
} 

public class ItemSubClass : Item 
{ 
    #region Category Property 
    private String _category = default(String); 
    public String Category 
    { 
     get { return _category; } 
     set 
     { 
      if (value != _category) 
      { 
       _category = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 
    #endregion Category Property 
} 

public class ViewModel 
{ 
    public ViewModel() 
    { 
     Items.Add(new Item { Name="Alan"}); 
     Items.Add(new ItemSubClass { Name = "Bob", Category = "Whatever" }); 
     Items.Add(new Item { Name = "Charlie" }); 
    } 

    public ObservableCollection<Item> Items { get; private set; } 
     = new ObservableCollection<Item>(); 
} 

スクリーンショット:

enter image description here

+0

''を実行しようとすると、コンパイラは 'x:Type'が見つからない、' DataTemplate'に 'x:Key'が含まれている'ItemsControl.Resources'にあります。私はwpfではなくuwpのために開発しています。私は2と彼らの間にこれらの愚かな小さな変化に気付いている彼らはすべてを混乱させる。 uwpの解決策はありますか? – vrwim

+0

@vrwimああ、私の悪い。私はタグを読まなかった。私がそれについて何が見えるかを素早く見てみましょう。 –

+0

@vrwim LoveToCodeのコメントが正しいことが分かります.Windows Universalアプリでは、[DataTemplateSelector(http://stackoverflow.com/a/29041446/424129)を書くだけです。 –

関連する問題