Я пытаюсь изменить цвет переднего плана текстового блока на основе свойства bool, чтобы его значение было изменено при нажатии кнопки. Однако по какой-то причине это не работает. Кроме того, должен ли я добавить свойство bool в список на первом месте? Я попытался добавить свойство bool непосредственно в DataContext, но это тоже не сработало. Любая помощь будет оценена по достоинству.Простой DataTrigger не работает. Зачем?
public static bool IsOn { get; set; } public static List<bool> boo;
private void Button_Click(object sender, RoutedEventArgs e)
{
IsOn = true;
boo = new List<bool>();
boo.Add(IsOn);
DataContext = boo;
}
<Window.Resources> <Style TargetType="TextBlock"> <Setter Property="Foreground" Value="Green" /> <Style.Triggers> <DataTrigger Binding="{Binding Path=IsOn}" Value="true"> <Setter Property="Foreground" Value="Red" /> </DataTrigger> </Style.Triggers> </Style> </Window.Resources> <Grid> <StackPanel> <Button Click="Button_Click" Content="Change Color" /> <TextBlock Name="textBlockColor" Text="My Foreground Color" /> </StackPanel>
Update: После ответа kmatyaszek, который работал хорошо, я узнал, что следующий код работает слишком, короткие и до точки:
public bool IsOn { get; set;}
private void Button_Click(object sender, RoutedEventArgs e)
{
IsOn = true;
textBlockColor.DataContext = this;
}
Update2: Как Viv предложил в комментариях, я попробовал его подход, создав отдельный класс, и следующий код работает просто отлично:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); }
private void Button_Click(object sender, RoutedEventArgs e)
{
Test test = new Test();
test.IsOn = true;
textBlockColor.DataContext = test;
}
}
public class Test
{
public bool IsOn { get; set; }
}
Обновление3 Следующий подход будет работать, а также Viv. В этом случае свойства добавляются в список, я также добавил второе свойство для тестирования. Тем не менее, этот подход требует знания собственности, связанной с используемым индексом:
public partial class MainWindow : Window { public List<bool> boo; public bool IsOn { get; set; } public bool IsBlue { get; set; }
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
IsOn = true;
IsGreen = true;
boo = new List<bool>();
boo.Add(IsOn);
boo.Add(IsGreen);
DataContext = boo;
}
}
XAML
<Window.Resources> <Style TargetType="TextBlock"> <Setter Property="Foreground" Value="Green" /> <Style.Triggers> <DataTrigger Binding="{Binding [1]}" Value="true"> <Setter Property="Foreground" Value="Blue" /> </DataTrigger> </Style.Triggers> </Style> </Window.Resources> <Grid> <StackPanel> <Button Click="Button_Click" Content="Change Color" /> <TextBlock Name="textBlockColor" Text="My Foreground Color" /> </StackPanel>
Update4 Следующий код работает также и с помощью словаря вместо списка позволяет каждому пункту быть определены с именем вашего выбора:
public partial class MainWindow : Window { public Dictionary<string,bool> booDictionary; public bool IsBlue { get; set; } public MainWindow() { InitializeComponent(); }
private void Button_Click(object sender, RoutedEventArgs e)
{
IsBlue = true;
booDictionary = new Dictionary<string,bool>();
booDictionary.Add("Blue",IsBlue);
DataContext = booDictionary;
}
}
XAML
<Window.Resources> <Style TargetType="TextBlock"> <Setter Property="Foreground" Value="Green" /> <Style.Triggers> <DataTrigger Binding="{Binding [Blue]}" Value="true"> <Setter Property="Foreground" Value="Blue" /> </DataTrigger> </Style.Triggers> </Style> </Window.Resources> <Grid> <StackPanel> <Button Click="Button_Click" Content="Ok" /> <TextBlock Name="textBlockColor" Text="Hey" /> </StackPanel>
Попробуйте с помощью 'DataTrigger' Binding как' Binding = {{Binding Path = [0]} "' – Viv
, если вы установили 'DataContext = IsOn;' в ваш обработчик кликов, тогда вам нужен ваш DataTrigger как ' 'В любом случае' IsOn' не является «свойством» объекта DataContext. Следовательно, вы не можете искать его. Если вы создаете класс, содержащий 'IsOn' в качестве свойства, и установите этот объект класса как« DataContext », вы можете указать« Path = IsOn » –
Viv
Использование словаря - лучшее решение, чем использование списка, как я объяснил в основном опубликовать сообщение. – usefulBee