在wpf列表框中设置复选框项的前景文本颜色

时间:2012-06-29 11:37:52

标签: c# wpf xaml checkbox listbox

我有几个包含数据库数据的列表。列表框用作图表的过滤器,列表框的外观应根据在其他列表框中选择的内容而更改。

以下是我正在努力做的一个简化示例:

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;
}

一个国家显然属于一个地区,我也有例如Ports,然后位于一个国家等等。

所有列表框项都是如下定义的复选框:

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

当点击任何列表框中的项目时,它们会被添加到过滤器列表中,这些过滤器将过滤显示图表的数据。因此,例如,如果在“区域”下选择“欧洲”,那么属于欧洲的所有国家/地区的国家/地区列表框中的颜色应不同,例如蓝色。

因此,在代码中,我想循环遍历国家/地区列表框中的复选框,并将其前景颜色设置为某些内容,具体取决于显示/标记到该复选框的值是否属于某个国家/地区所选区域通常在foreach循环中。但是,列表框中的项目是Region类型,那么如何访问底层复选框?这应该是我所知道的非常基本的东西,但它让我疯狂!

2 个答案:

答案 0 :(得分: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类(请参阅here
  • 将转换器添加到xaml中作为StaticResouce

如果区域IsChecked属性发生更改(来自ui或代码隐藏),则国家/地区复选框forecolor将自动更改,因此不需要循环。

我没有尝试过,可能你会发现错误,但我想表现出“哲学”

希望有所帮助

答案 1 :(得分:0)

如果我说得对,那么你的计划是在其所在地区突出显示一个国家,如果选择了哪个地区? Rq 1:您不必循环检查复选框以了解选择了哪个区域:这是绑定的目的,绑定集合本身的值将受到影响。
Rq2:如果更改代码中的值,则必须在U.I的区域类中实现INotifyPropertyChanged。待更新。
怎么做?
1.有一个RegionId的静态字典 - &gt;布尔。
2.每当选择/取消选择RegionId时,更新该字典并引发静态事件'SelectionDictionnaryUpdated'。
3.现在在Country类中添加一个通知属性“IsOwnerRegionSelected”。如果选择了相应的区域,它会在字典中查看 4.在Country类中添加属性“CountryRegionColor”。它将返回基于RegionId的颜色,例如RegionId - &gt;彩色静态字典。
5.在DataTemplate中添加一个Trigger,以及一个将在white和CountryRegionColor之间切换颜色的DataTrigger,具体取决于IsOwnerRegionSelected值。
6.在国家/地区的构造函数中,向SelectionDictionnaryUpdated添加一个处理程序,该处理程序将在“IsOwnerRegionSelected”上显示NotifyPropertyChanged。

就是这样!

  1. 你可以使用非共享字典(每个国家/地区都有一个RegionId - &gt;你在构造函数中注入的布尔字典属性)
  2. 你可以通过'CurrentCoulor'来简化事情:通知属性将返回white或CountryRegionColor,具体取决于是否选中它。只需将列表的背景绑定到该属性,并在捕获SelectionDictionnaryUpdated时更改notifyCurrentCoulor。