2017-02-01 24 views
1

チームメンバーに割り当てられたジョブを表示するために、仕事でアプリケーションを作成しようとしています。これは初めてWPFで作業したときです。私はこの前に簡単なテストプロジェクトを行って、WindowFormsと比較してWPFでの動作が理解できることを確認しました。私のデータがリストビューに表示されるようになっています。テストプロジェクトでは、データを適切に設定して表示することができましたが、ライブプロジェクトに移りスタイリングを開始して読みやすさと保守性のためにコードを実際に分離すると、私の問題が発生します。ここでは、リストビュースタイルのためのXAMLコードは次のとおりです。スタイルが設定されたWPFでデータが表示されないListView

<Style x:Key="baseListViewstyle" TargetType="ListView"> 
       <Setter Property="FontFamily" Value="Gautami"/> 
       <Setter Property="FontSize" Value="10"/> 
       <Setter Property="HorizontalAlignment" Value="Left"/> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="ListView"> 
          <ListView> 
           <ListView.View> 
            <GridView> 
             <GridViewColumn Width="{StaticResource ResourceKey=columnWidth}" Header="PRF"  DisplayMemberBinding="{Binding Path=[0]}"/> 
             <GridViewColumn Width="{StaticResource ResourceKey=columnWidth}" Header="Client ID" DisplayMemberBinding="{Binding Path=[1]}"/> 
             <GridViewColumn Width="{StaticResource ResourceKey=columnWidth}" Header="Drop Date" DisplayMemberBinding="{Binding Path=[2]}"/> 
             <GridViewColumn Width="{StaticResource ResourceKey=columnWidth}" Header="QTY"  DisplayMemberBinding="{Binding Path=[3]}"/> 
             <GridViewColumn Width="{StaticResource ResourceKey=columnWidth}" Header="Type"  DisplayMemberBinding="{Binding Path=[4]}"/> 
            </GridView> 
           </ListView.View> 
          </ListView> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 

私は100%確信している問題は、このスタイルからですが、私はそれを解決するかどうかはわかりません。私はスタイルを取り出してListViewsは、コードの背後から追加されているすべてのアイテムを表示しますが、ヘッダーはありません(明らかに)、単にアイテムのタイプを表示します(この場合ListViewsの状態文字列[] x回)。ヘッダー宣言をウィンドウのXAMLに移動するのではなく、style.xamlで分離したままにしておきます。これらのListViewはコード全体で十数回再利用されるため、ほとんどは動的に追加されますユニファイドスタイルを指すとメンテナンスが指数関数的に簡単になります。私はこれがスタイルの単純な問題だと思っています。違う綴じが必要なのでしょうか、それともスタイルで起きているのでヘッダーを違うと宣言するべきでしょうか?ここで参照するのは、リストビューにデータを追加するコードです。あなたが効果的にあなたがあなたのスタイルで空のものに移入されているリストビューの外観を「上書き」されているので、

private static void populateListView(ListView lv, List<Label> labels) 
    { 
     if (lv.Tag != null) 
     { 
      SqlConnectionStringBuilder conString = new SqlConnectionStringBuilder(); 
      conString.IntegratedSecurity = true; 
      conString.DataSource = "oh50ms04\\Server_1"; 

      using (SqlConnection con = new SqlConnection(conString.ToString())) 
      { 
       con.Open(); 
       string sqlCMD = getSQLCommand(lv.Tag.ToString(), labels); 
       SqlCommand cmd = new SqlCommand(sqlCMD, con); 
       try 
       { 
        using (SqlDataReader reader = cmd.ExecuteReader()) 
        { 
         while (reader.Read()) 
         {         
          string[] arr = new string[] { reader["JobID"].ToString(), reader["ClientID"].ToString(), DateTime.Parse(reader["RDD"].ToString()).ToString("MM/dd/yy"), reader["QuantityFinishedPieces"].ToString(), reader["Type"].ToString() }; 
          lv.Items.Add(arr); 
         } 
        } 
       } 
       catch (Exception e) 
       { 
        MessageBox.Show(e.Message); 
       } 
      } 
     } 
    } 

答えて

1

のControlTemplateは、コントロールの(全体)の外観を定義します。スタイルではなく、テンプレートをオーバーライドGridViewコントロールにListViewコントロールのViewプロパティを設定するために

試してみてください。

<Style x:Key="baseListViewstyle" TargetType="ListView" x:Shared="False"> 
    <Setter Property="FontFamily" Value="Gautami"/> 
    <Setter Property="FontSize" Value="10"/> 
    <Setter Property="HorizontalAlignment" Value="Left"/> 
    <Setter Property="View"> 
     <Setter.Value> 
      <GridView> 
       <GridViewColumn Width="{StaticResource ResourceKey=columnWidth}" Header="PRF"  DisplayMemberBinding="{Binding Path=[0]}"/> 
       <GridViewColumn Width="{StaticResource ResourceKey=columnWidth}" Header="Client ID" DisplayMemberBinding="{Binding Path=[1]}"/> 
       <GridViewColumn Width="{StaticResource ResourceKey=columnWidth}" Header="Drop Date" DisplayMemberBinding="{Binding Path=[2]}"/> 
       <GridViewColumn Width="{StaticResource ResourceKey=columnWidth}" Header="QTY"  DisplayMemberBinding="{Binding Path=[3]}"/> 
       <GridViewColumn Width="{StaticResource ResourceKey=columnWidth}" Header="Type"  DisplayMemberBinding="{Binding Path=[4]}"/> 
      </GridView> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

間違いなく助けた、しかし、今、私はエラーを取得しています「もっと見るで共有することはできません1つのListViewよりも "。私はそれについて掘り下げています。ほとんどの答えはDyanmicResource(実行に失敗すると失敗します)とx:Shared = "False"(スタイルのどこでも見つけることができません)どこが有効なオプションか) – UngarTheDestroyer

+0

編集した回答ごとにスタイルのx:Shared属性を設定できます。 GridViewは、ListView自体の外観ではなく、ListViewに表示されている実際のデータに密接に接続されているため、一般的にStyleでGridViewを定義することはありません。 – mm8

+0

スタイルでgridviewを定義してはならない場合は、スタイルとヘッダーを定義する必要がありますか?私がこのようにしようとしている主な理由は、あとでヘッダーを削除、追加、または変更する場合、スタイルの変更が必要なだけで、それはすべてのリストビューに影響します。スタイルを指すアプリ。 – UngarTheDestroyer

関連する問題