2012-06-29 2 views
1

У меня есть несколько списков, содержащих данные из db. Списки отображаются в качестве фильтров для диаграммы, и появление списков должно меняться в зависимости от того, что выбрано в других списках.Установите цвет текста переднего плана элементов флажка в списке wpf

Вот упрощенный пример того, что я пытаюсь сделать, а именно:

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 являются флажками, определенные как это:

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

Как элементы в любом ListBox нажатия они добавляются в список фильтров, которые будут Filte r данные, отображающие график. Так, например, если «Европа» выбрана в Регионах, тогда все страны, принадлежащие Европе, должны быть по-разному окрашены в список для стран, например синий.

Так что в коде я хочу Переберите флажков в стране-ListBox и установите цвет переднего плана на то, в зависимости от того, если отображаются значение/привязанные к этому флажку является страной, которая принадлежит к выбранной области, так как правило, в цикле foreach. Однако элементы в списке имеют тип Region, и как я могу получить доступ к базовому флажку? Это должно быть довольно простой материал, который я знаю, но он меня заводит!

ответ

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> 

Примечание:

  • Вы должны реализовать класс конвертер (см here)
  • Добавить преобразователь в XAML, как StaticResouce

Страна Флажки ForeColor изменится автоматически, если регионы IsChecked свойство изменилось (от ui или от кода), поэтому цикл не нужен.

Я не пробовал, наверное, вы можете найти ошибки, но я хотел, чтобы показать «ФИЛОСОФИЮ»

Надеется, что это помогает

+0

Привет Миклош и благодарю вас за быстрый ответ. К несчастью, это не совсем то, что я ищу. Мне нужно изменить цвет текста элементов в списке, но они не выбираются/не проверяются. Цвет необходимо изменить, но без проверки флажков. Я попытался объяснить это дело здесь http://i48.tinypic.com/1zh3czc.png – ardal

+0

Собственно, это именно то, что вам нужно. Связывание не основано на проверке страны, она основана на том, проверен ли родительский регион страны. Вот почему он называется 'IsParentChecked'. Вы должны попытаться реализовать то, что он предложил. – Alain

+0

иногда свойства readonly не обновляются, даже если на них поднят NotifyPropertyChanged. объявлять как обычное свойство, если экспериментировать с проблемами обновлений. – GameAlchemist

0

Если я получаю вас правильно, ваш план должны иметь страну особо в области региона, если его регион выбран? Rq 1: вам не нужно проходить через контрольные поля, чтобы узнать, какая область выбрана: это цель привязки, на которую влияют значения привязанной коллекции.
Rq2: Если вы меняете значения в коде, вы должны реализовать INotifyPropertyChanged в своем классе области для U.I. быть обновленным.
Как это сделать?
1. иметь статический dictionnary RegionId -> Boolean.
2. Всякий раз, когда RegionId получает выбранный/невыбранный, обновите этот dictionnary и поднимите статическое событие «SelectionDictionnaryUpdated».
3. Теперь добавьте в свой класс Country уведомление «IsOwnerRegionSelected». он будет смотреть в словаре, чтобы сказать, выбрана ли соответствующая область или нет.
4. добавьте свойство CountryRegionColor в свой класс Country. Он вернет цвет на основе RegionId и, скажем, RegionId -> Color static dictionnary.
5. добавьте триггер внутри вашего DataTemplate и DataTrigger, который переключит цвет между белым и CountryRegionColor, в зависимости от значения IsOwnerRegionSelected.
6. В конструкторе страны добавьте обработчик SelectionDictionnaryUpdated, который будет NotifyPropertyChanged в «IsOwnerRegionSelected».

все!

  1. вы можете сделать это с не-разделяемой dictionnary (каждая страна, имеющая в RegionId -> Boolean dictionnary свойство, которое Вы вводите в конструкторе)
  2. вы можете сделать вещи проще, имея «CurrentCoulor»: уведомляя имущество, будет возвращать белый или CountryRegionColor в зависимости от того, выбран ли он или нет. просто привяжите Background вашего списка к этому свойству и notifyCurrentCoulor изменился, когда вы поймаете SelectionDictionnaryUpdated.
+0

Решение Miklós Balogh более изящно, но вам нужно подумать о таком решении, как мое, если вы планируете сделать несколько выборов в регионе/стране (expl: выбор 2 страны для футбольного матча). В этом случае вам нужно перейти на нестационарную версию dictionnary, каждый dic. является селектором для стран. – GameAlchemist

Смежные вопросы