2013-07-08 10 views
2

Я пытаюсь изменить цвет переднего плана текстового блока на основе свойства 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> 
+1

Попробуйте с помощью 'DataTrigger' Binding как' Binding = {{Binding Path = [0]} "' – Viv

+2

, если вы установили 'DataContext = IsOn;' в ваш обработчик кликов, тогда вам нужен ваш DataTrigger как ' 'В любом случае' IsOn' не является «свойством» объекта DataContext. Следовательно, вы не можете искать его. Если вы создаете класс, содержащий 'IsOn' в качестве свойства, и установите этот объект класса как« DataContext », вы можете указать« Path = IsOn » – Viv

+0

Использование словаря - лучшее решение, чем использование списка, как я объяснил в основном опубликовать сообщение. – usefulBee

ответ

4

Прежде всего, ваш класс должен реализовать INotifyPropertyChanged (msdn), чтобы уведомить вас о том, что ваша собственность была изменена.

Во-вторых, вы должны назначить DataContext в MainWindow конструктор.

Пример:

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     this.DataContext = this; 
    } 

    private bool _isOn; 
    public bool IsOn 
    { 
     get { return _isOn; } 
     set { _isOn = value; OnPropertyChanged("IsOn"); } 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     IsOn = !IsOn;   
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string propName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propName)); 
    } 
} 

Ваш код XAML ОК.

Когда ваша переписка не работает, вы должны использовать snoop в будущем.

+0

Мне понравился IsOn =! IsOn :) – usefulBee

+0

Спасибо. Просто хотел добавить, что вам не нужно назначать DataContext в конструкторе MainWindow. Это может потребоваться в других случаях, о которых я сейчас не знаю в данный момент, но в нашем примере он отлично работает внутри обработчика событий кликов. – usefulBee

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