質問
に基づいてWPFでタグクラウドを構築しようとしています 既存の実装 [ソースをダウンロードします]。私は実装を完全に理解していませんでした。私の問題は、フォントサイズをコレクションの数のアイテムの数にバインドする代わりに、クラスに含まれる他の値にバインドしたいということです。ここでこの部分では、
FontSize="{Binding Path=ItemCount, Converter={StaticResource CountToFontSizeConverter}}"
フォントサイズを何か他のものにバインドしたいです。それ、どうやったら出来るの? ItemCountはどこに属しますか?
ありがとう
解決
ItemCount
に属します グループ そのタグから生成されるコレクションビュー内。
例:私がリストを持っている場合
AABBBC
そして、私はそれらをグループ化します:
グループA:itemcount = 2
グループB:itemcount = 3
グループC:itemcount = 1
タグクラウドの全体的なポイントは、特定のタグが使用される頻度を視覚化するため、そのまさにそのプロパティにバインドすることです。
あなたのコメントに応答するために、ベアボーンのセットアップは次のようなものでなければなりません:
<ItemsControl ItemsSource="{Binding Data}">
<ItemsControl.Resources>
<vc:CountToFontSizeConverter x:Key="CountToFontSizeConverter"/>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" Margin="2"
FontSize="{Binding Count, Converter={StaticResource CountToFontSizeConverter}}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
データオブジェクトクラスがプロパティを公開すると仮定します Name
と Count
, 、data-objectクラスが実装する必要があるカウントが上がるとサイズが変更されることを確認するために INotifyPropertyChanged
, 、それはそれにあるすべてのことです。
public class Tag : INotifyPropertyChanged
{
private string _name = null;
public string Name
{
get { return _name; }
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged("Name");
}
}
}
private int _count = 0;
public int Count
{
get { return _count; }
set
{
if (_count != value)
{
_count = value;
OnPropertyChanged("Count");
}
}
}
//...
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
他のヒント
ItemCountは、フォントサイズを変更するWPFオブジェクトのデータコンテキストプロパティに含まれるインスタンスのプロパティです。階層ツリーでは、すべてから FrameworkElement
以降、「DataContext」プロパティを継承します。
と "詮索" 実行時にWPFアプリのUIツリーを調べて、DatAcontextにいつでもどのオブジェクトがライブしているかを把握できます。