2011-01-20 7 views
0

WP7のXamlでobservableConnectionとリストボックスを結びつけようとしています。私がしたいのは、ObservableConnectionから継承したクラスのインスタンスをリストボックスに表示し、リストボックスにスタイルを適用することだけです。私はデータバインディングとスタイルの問題

public Storage.Categories tmp; 
... 
tmp = new Storage.Categories(); 
listBox1.ItemsSource = tmp; 

のようなコードからこれを行うことができますが、どのようにスタイルを適用するのですか? ここにコードは

<ListBox Height="497" 
     HorizontalAlignment="Left" 
     Margin="0,104,0,0" 
     Name="listBox1" 
     VerticalAlignment="Top" 
     Width="450"> 


namespace Genesa.Storage 
{ 
    public class Categories : ObservableCollection<Category> 
    { 
     public void LoadCategories() 
     { 
      // deserialize obiect 
     } 

     public void SaveCategories() 
     { 
      // serialize obiect 
     } 

     public Categories() : base() 
     { 
      LoadCategories(); 
     } 
    } 

    public class Category 
    { 
     public Category() { } 
     public String name { get; set; } 
     public String description { get; set; } 

     public Category(String _name, String _description) 
     { 
      name = _name; 
      description = _description; 
     } 

     public override string ToString() 
     { 
      return String.Format("{0} - {1}", name, description); 
     } 
    } 
} 
+0

あなたはWPFとObservableCollectionを意味するのですか、それともこのWP7は私がまだ聞いたことのない新技術ですか? –

+0

WP7はWindows Phone 7です。 –

+0

@Derek Lakin、編集していただきありがとうございます。 –

答えて

1

あなたはDataTemplateを使いたいと思うでしょう。データテンプレートを使用して、ListBox内のアイテムを構造化しましょう。例:

<ListBox> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding name}" /> 
      <TextBlock Text="{Binding description}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

また、ObservableCollectionを継承して再検討することもできます。あなたがやっていることが上のように簡単なのであれば、おそらく、ObservableCollectionを含み、INotifiyPropertyChangedインターフェースを実装するクラスを作ることに固執したいと思うでしょう。これは、MVVMデザインパターンを使用していることを前提としています。そうでない場合は、この提案を無視してください。 MVVMを実装している場合は、CategoryクラスにINotifyPropertyChangedインタフェースを実装させたい場合もあります。

0

ジャレッドが示唆するように、あなたの解決に最も適切なアプローチが代わりにすることの、あなたがあなたのクラスのプロパティに直接結合することが可能にする、ListBoxに各項目の構造を定義するListBoxためItemTemplateを提供することですToStringメソッドをオーバーライドします。しかし、それだけで単一の項目を含めることができるため、ジャレッドのDataTemplateで小さなミスがあり、その下に示すようあなたは、コンテナのいくつかの種類の要素をラップする必要があります。

<ListBox> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding name}" /> 
       <TextBlock Text="{Binding description}" /> 
      </StackPanel> 
     </DataTemplate>  
    </ListBox.ItemTemplate> 
</ListBox> 

あなただけINotifyPropertyChangedを実装する必要がありますCategoryクラスで、そのオブジェクトの存続期間中にプロパティが変更される可能性がある場合。価値が生涯にわたって一定であれば、必要はありません。

0

通常、ObservableCollectionは、ビューがバインドされるViewModelのメンバーです。 ObservableCollectionから継承する必要はなく、CategoriesクラスのロジックをViewModel内に配置することができます。

次に、階層のページまたは他のオブジェクトのDataContextをViewModelに設定し、次にListBox.ItemsSourceをViewModel.ObservableCollectionにバインドする必要があります。

その後、DataTemplateはカテゴリ(ObservableCollectionの単一項目)で機能します。

ローディングなどのロジックに関しては、通常、これらの操作を担当するレイヤがもう1つあります。これはViewModelに注入されますが、必要がない場合は問題ありません。

関連する問題