2011-01-12 10 views
0

私は自分自身にいくつかの.NETプログラミングを教えています。現在、WPFでタグクラウドコントロールを構築しようとしています。目的は、最初のリストボックスが "ContactLists"のリストを表示し、2番目のリストボックスがContactListsに関連付けられた "ラベル"(またはタグ)を表示するウィンドウに2つのリストボックスを持つことです。ラベルの目的は、IValueConverterを使用してitemCountにフォントサイズをバインドすることです。コレクションに数回出現する特定のラベルがある場合、ラベルリストボックスに大きなフォントで表示されます。また、私はDB2データベースからコントロールを移入しています。IValueConverterデータバインディング

私はコンタクトリストとラベルを正しいリストボックスに表示していますが、バインディングに問題があります。私はチュートリアルから取ったコンバータークラスを使用しています。誰かが私にこの作業を手助けできるかどうか疑問に思っていました。多くの感謝 - ベン

プロパティ

public class Label 
{ 
    public int LabelID { get; set; } 
    public string LabelName { get; set; } 

} 

ContactListClass

public class ContactList  
    {   
     public string ContactListName { get; set; } 
     public List<Label> Labels { get; set; } 

    } 

コンバータ

public class CountToFontSizeConverter : IValueConverter 
    { 
     #region IValueConverter Members 

     public object Convert(object value, Type targetType, 
      object parameter, CultureInfo culture) 
     { 
      const int minFontSize = 6; 
      const int maxFontSize = 38; 
      const int increment = 3; 
      int count = (int)value; 
      return ((minFontSize + count + increment) < maxFontSize) ? 
        (minFontSize + count + increment)    : 
        maxFontSize; 
     } 

     public object ConvertBack(object value, Type targetType, 
      object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
     #endregion 
    } 

ウィンドウLoadedイベント

private void Window_Loaded(object sender, System.Windows.RoutedEventArgs e) 
    { 
     //TODO: Add event handler implementation here. 
     ListCollectionView lcv = new ListCollectionView(myLabels); 

     lcv.GroupDescriptions.Add(new PropertyGroupDescription("LabelName")); 

     tagsList.ItemsSource = lcv.Groups;      
    } 

XAML

<Window.Resources> 
    <local:CountToFontSizeConverter x:Key="CountToFontSizeConverter"/> 

    <Style x:Key="tagsStyle" TargetType="{x:Type ListBox}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBox}"> 
        <Grid> 
         <Border x:Name="Border" 
           BorderBrush="{TemplateBinding BorderBrush}" 
           BorderThickness="{TemplateBinding BorderThickness}"/> 
          <WrapPanel Orientation="Horizontal" 
             Margin="2" 
             IsItemsHost="true" 
             Background="#FFFCF6F6"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

    <DataTemplate x:Key="ContactsTemplate"> 
    <WrapPanel> 
     <TextBlock TextWrapping="Wrap" 
         Text="{Binding ContactListName, Mode=Default}"/> 
    </WrapPanel> 
    </DataTemplate> 

    <DataTemplate x:Key="TagsTemplate"> 
    <WrapPanel> 
     <TextBlock Text="{Binding LabelName, Mode=Default}" 
         TextWrapping="Wrap" 
         FontSize="{Binding ItemCount, 
            Converter={StaticResource CountToFontSizeConverter}, 
            Mode=Default}" 
         Foreground="#FF0D0AF7"/> 
    </WrapPanel> 
    </DataTemplate> 
</Window.Resources> 

<Grid x:Name="LayoutRoot" Background="#FFCBD5E6"> 
    <ListBox x:Name="contactsList" 
      SelectionMode="Multiple" 
      Margin="7,8,0,7" 
      ItemsSource="{Binding ContactLists, Mode=Default}" 
      ItemTemplate="{DynamicResource ContactsTemplate}" 
      HorizontalAlignment="Left" 
      Width="254"/> 

    <ListBox x:Name="tagsList" 
      Margin="293,8,8,8" 
      ItemsSource="{Binding Labels, Mode=Default}" 
      ItemTemplate="{StaticResource TagsTemplate}" 
      Style="{StaticResource tagsStyle}" /> 
</Grid> 
+0

FYI - あなたの質問をより読みやすくするために再フォーマットしました。最初は、私はこのすべてのものがそこにあったことを知らなかった。将来的には、読みやすい形式で記事を投稿すれば、回答を得る可能性は非常に高くなります。これがあなた自身のコードからコピー貼り付けされたものだったならば、あなたもそこで何らかのフォーマットをすることを謙虚にお勧めします。そのコードをとても簡単に保つことができます。 –

答えて

0

はあなたの問題を非常に正確ではありませんので、私はちょうどいくつかのコメントを吐くつもりです。

問題は、モデル(LabelとContactList)がINotifyPropertyChangedを実装していないため、WPFがそのようなプロパティーが変更されたことを知ることが難しいことです。ただし、実行時に値を変更しない場合は、問題はありません。

また、NotImplementedExceptionをスローする代わりにBinding.DoNothingを返す方がよいでしょう。

Mode = Defaultをどこからでも削除することもできますが、必須ではありません。

タグを含むリストボックスにバインドしています。しかし、なぜあなたはコンタクトリストをバインドしていませんか?あなたはコードを介してすべてを設定するか、またはバインディングを使用する必要があります(そして私はバインディングを優先します)。

実際の問題の詳細については、お手数ですがお手伝いできます。

+0

ご回答ありがとうございます。あいまいなご質問を申し訳ありません。だから、実行時に値を変更していないので、INotifyPropertyChangedを実装しなかったのです。実際の問題は、私のtagsTemplateのLabelNameを、そのコレクションの名前が何回出現するかの数にバインドする方法です。 – Ben

0

ベンまだ、あなたが直面している問題についてはわかりません。

コードを実行するとどうなりますか? ラベル名のフォントサイズが変更されていますか?私はあなたのコード内で見ることができます

問題 -

1あなたはXAMLとコードの両方であなたのtagsListのためのItemsSourceを設定している -

のItemsSource = "{ラベルバインディング、 モード=デフォルト}"

tagsList.ItemsSource = lcv.Groups;

2どこにも定義されているItemCountプロパティは表示されません。

3 FontSizeはdouble値なので、コンバーターはintではなくdouble値を返す必要があります。

4「ラベル」リストは、観察可能なコレクションである必要があります(実行時にアイテムが追加または削除される場合があります)。

関連する問題