我有几个包含数据库数据的列表。列表框用作图表的过滤器,列表框的外观应根据在其他列表框中选择的内容而更改。
以下是我正在努力做的一个简化示例:
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类型,那么如何访问底层复选框?这应该是我所知道的非常基本的东西,但它让我疯狂!
答案 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>
注意:强>
如果区域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。
就是这样!