1

データベースからのデータを含むリストがいくつかあります。リストボックスはグラフのフィルターとして機能し、リストボックスの外観は、他のリストボックスで選択されているものに応じて変化する必要があります。

これは、私が具体的にやろうとしていることの簡単な例です:

Class Region
{
public int RegionID { get; set; }
public string RegionName { get; set; }
}

Class Country
{
public int CountryID { get; set; }
public string CountryName { get; set; }
public int RegionID { get; set; }
}

private void fillListBoxes()
{
List<Region> allRegions = getRegions();
lstRegionsFilter.ItemsSource = allRegions;
}

国は明らかに地域に属しており、たとえば、国などに配置されているポートもあります。

すべてのリストボックス項目は、次のように定義されたチェックボックスです。

<ListBox Name="lstRegionsFilter">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding Path=RegionName}"
                      Tag="{Binding Path=RegionID}" 
                      Click="CheckBox_Click"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

リストボックス内の項目をクリックすると、グラフを表示するデータをフィルタリングするフィルターのリストに追加されます。たとえば、[地域] で [ヨーロッパ] が選択されている場合、ヨーロッパに属するすべての国は、国のリストボックスで異なる色 (青など) で表示される必要があります。

したがって、コードでは、国リストボックスのチェックボックスをループし、そのチェックボックスに表示/タグ付けされた値が選択された地域に属する国であるかどうかに応じて、その前景色を何かに設定したいので、通常は foreach ループ。ただし、リストボックス内のアイテムは地域タイプなので、基になるチェックボックスにアクセスするにはどうすればよいですか? これは私が知っているかなり基本的なことですが、それは私を夢中にさせます!

4

2 に答える 2

1

これを試して:

public class Region : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private bool isChecked;

    private void OnPropertyChaned(string property)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(property));
    }

    public int RegionID { get; set; }
    public string RegionName { get; set; }

    public bool IsChecked
    {
        get { return isChecked; }
        set
        {
            if (isChecked != value)
            {
                isChecked = value;
                OnPropertyChaned("IsChecked");
            }
        }
    }
}

public class Country : INotifyPropertyChanged
{
    private readonly Region parentRegion;

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(property));
    }

    public Country(Region parent)
    {
        parentRegion = parent;
        parentRegion.PropertyChanged += ParentChanged;
    }

    private void ParentChanged(object sender, PropertyChangedEventArgs e)
    {
        if(e.PropertyName.Equals("IsChecked"))
        {
            OnPropertyChanged("IsParentChecked");
        }
    }

    public int CountryID { get; set; }
    public string CountryName { get; set; }
    public int RegionID { get { return parentRegion.RegionID; }}
    public bool IsParentChecked
    {
        get { return parentRegion.IsChecked; }
    }
}

そしてxaml:

これはリージョン用です:

<ListBox Name="lstRegionsFilter">
<ListBox.ItemTemplate>
    <DataTemplate>
        <CheckBox Content="{Binding Path=RegionName}"
                  Tag="{Binding Path=RegionID}"
                  IsChecked="{Binding Path=IsChecked}"
                  Click="CheckBox_Click"/>
    </DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

そして、これは国のためのものです

<ListBox Name="lstCountriesFilter">
<ListBox.ItemTemplate>
    <DataTemplate>
        <CheckBox ...
                  Foreground={Binding IsParentChecked, Converter={StaticResource boolToBrushConverter}"/>
                  ...
                  />
    </DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

ノート:

  • Converter クラスを実装する必要があります (こちらを参照) 。
  • コンバーターを StaticResouce として xaml に追加します。

地域の IsChecked プロパティが (UI またはコード ビハインドから) 変更されると、Country Checkboxes の前色が自動的に変更されるため、ループは必要ありません。

私は試していません。おそらく間違いを見つけることができますが、「哲学」を示したかったのです。

それが役に立てば幸い

于 2012-06-29T11:52:32.237 に答える
0

私が正しければ、あなたの計画は、その地域が選択されている場合、その地域の色で国を強調表示することです? Rq 1 : どの領域が選択されているかを知るために checkBoxes をループする必要はありません。これは、バインドされたコレクション自体の値が影響を受けるというバインドの目的です。
Rq2 : コードで値を変更する場合、UI を更新するには、リージョン クラスに INotifyPropertyChanged を実装する必要があります。
どうやってするの ?
1. RegionId --> ブール値の静的辞書を持っています。
2. RegionId が選択または選択解除されるたびに、その辞書を更新し、静的イベント「SelectionDictionnaryUpdated」を発生させます。
3. Country クラスに通知プロパティ「IsOwnerRegionSelected」を追加します。辞書を調べて、対応する地域が選択されているかどうかを確認します。
4. Country クラスにプロパティ「CountryRegionColor」を追加します。RegionId に基づいて色を返します。たとえば、RegionId -> Color 静的辞書などです。
5. DataTemplate 内に Trigger を追加し、IsOwnerRegionSelected 値に応じて白と CountryRegionColor の間で色を切り替える DataTrigger を追加します。
6. 国のコンストラクターで、「IsOwnerRegionSelected」で NotifyPropertyChanged を行う SelectionDictionnaryUpdated にハンドラーを追加します。

それでおしまい !

  1. 非共有辞書で作成できます(各国にはRegionIdがあります->コンストラクターに注入するブール辞書プロパティ)
  2. 選択されているかどうかに応じて、白または CountryRegionColor のいずれかを返す 'CurrentCoulor': 通知プロパティを使用することで、物事を簡単にすることができます。リストの背景をそのプロパティにバインドするだけで、SelectionDictionnaryUpdated をキャッチすると、notifyCurrentCoulor が変更されます。
于 2012-06-29T12:49:54.490 に答える