2012-02-08 10 views
0

リストビューのためにこれらをたくさん書く。思わ肥大化はほとんどが最初のDataContextを設定し、インクルードがテキストコンバーターを使用したバインド

<TextBlock DataContext="{Binding Path=SiteId, Converter={StaticResource siteConverter},ConverterParameter=SiteId}" Text="{Binding Path=SiteName}" ></TextBlock> 

への結合アプライ明確にするために、テキストプロパティに直接結合

EDIT が追加されました完全なXAMLを行うにはあります

<ListView SelectedItem="{Binding SelectedReport}" AlternationCount="2" Grid.Row="2" Name="reportList" ItemsSource="{Binding ReportsView}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch"> 
      <ListView.View> 
       <GridView> 
        <GridView.ColumnHeaderContextMenu> 
         <ContextMenu > 
          <MenuItem Header="Ascending" /> 
          <MenuItem Header="Descending" />  
         </ContextMenu> 
        </GridView.ColumnHeaderContextMenu> 
        <GridViewColumn Header="Action" CellTemplate="{StaticResource imageCell}" Width="Auto"/> 
        <GridViewColumn Header="Reportname" Width="Auto" CellTemplate="{StaticResource reportNameCell}"/> 
        <GridViewColumn Header="Site" Width="Auto" CellTemplate="{StaticResource reportSiteNameCell}"/> 
        <GridViewColumn Header="Company" Width="Auto" CellTemplate="{StaticResource reportCompanyNameCell}"/> 
        <GridViewColumn Header="Type" Width="Auto" DisplayMemberBinding="{Binding DocType}"/> 
        <GridViewColumn Header="Status" Width="Auto" DisplayMemberBinding="{Binding Status}"/> 
        <GridViewColumn Header="Created by" Width="Auto" DisplayMemberBinding="{Binding CreatedBy}"/> 
        <GridViewColumn Header="Language" Width="Auto" DisplayMemberBinding="{Binding CreatedBy}"/> 
        <GridViewColumn Header="Updated" Width="Auto" DisplayMemberBinding="{Binding Updated}"/> 
       </GridView> 
      </ListView.View> 
     </ListView> 
これは私が

ReportList = reportListService.Open(filePath); 
this.reportsView = CollectionViewSource.GetDefaultView(this.ReportList.Reports); 
this.reportsView.SortDescriptions.Add(
new SortDescription("ReportName", ListSortDirection.Ascending)); 
私のviewmodelをロードする方法である

EDIT

レポートリストにはsiteidのみが含まれています

答えて

2

[OK]を、よく...最初の物事のカップル:

1)なぜあなたはConverterParameterとしてSiteIdに渡すだけでなく、それが結合の対象とされています。これは冗長です... Convertメソッドの値とパラメーターと同じパラメーターを渡していますか?

2)あなたはListViewを使用している場合は、好ましくは監視可能なコレクション(へItemsSourceをバインド)、その後、ListView.ItemTemplateとしてDataTemplateを使用しています。 DataTemplateが複数のListViewで再利用可能な場合は、リソースとして作成し、ItemTemplateをリソースにバインドするように設定します。

またはもっと良い解決策:ビューモデルからものを公開する必要があります。 "SiteName"はビジネス関連のようにビューに関連しているようには聞こえません。だから、コンバータのロジックをビューモデルレイヤーに置き、追加のプロパティを公開してください。

+0

ビンゴ。それをより良い方法で合計してくれてありがとう。 –

+0

+1:それは私が言いたかったものです(少なくとも "Or ..."という部分に関して)。しかし、理解するのは間違いありません。 – Nuffin

0

はい、View自体のデータコンテキストをViewModelクラスに設定しました。そして、あなたがコントロールのために行うために必要なすべては以下のとおりです。

Text="{Binding StringPropertyToBindTo}" 
+0

SiteNameプロパティはviewmodelにありません。SiteIdだけです。なぜ変換が必要なのですか – klashagelqvist

+0

どのようにsiteNameを取得しますか?コード内のどこから来ますか? –

+0

siteidは、私のviewmodel内のreportclassのプロパティです。私はリストビューのsiteidの代わりにsitenameを表示する必要があり、私はコンバータにsiteidを送信してサイト名を取得している – klashagelqvist

0

最も簡単な方法は、コンバータは、現在実装された機能が含まれているあなたのデータコンテキストでSiteプロパティを実装することになります。その後、簡単にSite.SiteNameにバインドすることができます。厄介な驚きを避けるためにSiteIdが設定されている場合は、データコンテキストがSiteの場合はPropertyChangedイベントが発生するようにしてください。

ただし、共通のインターフェイスや異なる基本クラスを持たないさまざまなデータコンテキストに対して、同じパラメータを持つ場所のすべての場所でコンバーターを使用すると、上記の方法は実用的ではありません。

+0

このような煩わしさには申し訳ありません。私のdatamodelを変更して、サイト名を表示するだけで – klashagelqvist

+0

そのロジックを別のクラス(コンバーター)に入れて、ViewModelにメソッド呼び出しをラップすることもできます。そうすれば、あなたのVMのコードはそのままで、より便利なバインディング構文を持つことができます。 – Nuffin

+0

明確にするために私の質問を編集しました。あなたの答えは、私はSiteNameプロパティを含むviewmodelのための余分なクラスを作成し、元のデータでそのクラスをロードすることを暗示するでしょう – klashagelqvist

関連する問題