Вот быстрый и грязный пример того, что вы можете сделать, код имеет внешний цикл, который перебирает цвета и создает 10 экземпляров игрока на цвет.
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
class Player {
public:
Player(int id, string color, string name) :
_id(id), _color(color), _name(name) {
}
int getId() { return _id; }
string getColor() { return _color; }
string getName() { return _name; }
string toString() {
ostringstream ss;
ss << _id << "," << _color << "," << _name;
return ss.str();
}
private:
int _id;
string _color;
string _name;
};
int main() {
vector<Player> players;
int playerId = 0;
for (auto color : {"black", "blue", "green", "cyan", "red"}) {
for (int i = 0; i < 10; ++i) {
playerId++;
players.emplace_back(Player(playerId, color, "Player" + to_string(playerId)));
}
}
for (auto p : players) {
cout << p.toString() << endl;
}
return 0;
}
Вы можете создать IValueConverter
, который преобразует целое число в логическое значение на основе CutOff
. Затем используйте DataTrigger.Value
из True
(или False
, в зависимости от того, что вы возвращаете).
WPF DataTrigger
s строго по сравнению с равенством, если я правильно помню.
Так что-то похожее на:
public class CutoffConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
return ((int)value) > Cutoff;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
throw new NotImplementedException();
}
public int Cutoff { get; set; }
}
Тогда используйте следующий XAML.
<Window.Resources>
<myNamespace:CutoffConverter x:Key="AgeConverter" Cutoff="30" />
</Window.Resources>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Age,
Converter={StaticResource AgeConverter}}">
<DataTrigger.Value>true</DataTrigger.Value>
<Setter TargetName="Age" Property="Foreground" Value="Red"/>
</DataTrigger>
</DataTemplate.Triggers>
Я бы порекомендовал использовать IValueConverter
для привязки к элементу Foreground
Age TextBlock
и изоляции логики раскраски там.
<TextBlock x:Name="Age"
Text="{Binding Age}"
Foreground="{Binding Path=Age, Converter={StaticResource AgeToColorConverter}}" />
Затем в коде:
[ValueConversion(typeof(int), typeof(Brush))]
public class AgeToColorConverter : IValueConverter
{
public object Convert(object value, Type target)
{
int age;
Int32.TryParse(value.ToString(), age);
return (age >= 30 ? Brushes.Red : Brushes.Black);
}
}