2010-10-19 2 views
2

Я не знаю, правильно ли я использую свойства зависимостей, но, похоже, мой просмотр никогда не обновляется. У меня есть триггер стиля для изменения стилей моих элементов. Кажется, что код работает, но представление не обновляется. Это мой первый раз с помощью Dependency Property & я, возможно, использовать его неправильноЗависимость собственности не обновляется?

C#

public bool CanSave 
{ 
    get { return (bool)GetValue(CanSaveProperty); } 
    set { SetValue(CanSaveProperty, value); } 
} 

public static readonly DependencyProperty CanSaveProperty = 
    DependencyProperty.Register("CanSave", typeof(bool), typeof(EditorTabViewModel), new PropertyMetadata(false)); 

public string Content 
{ 
    get { return _content; } 
    set 
    { 
     if ((bool)GetValue(CanSaveProperty) == false) 
     { 
      SetValue(CanSaveProperty, true); 
      RaisePropertyChanged("CanSave"); 
     } 
     _content = value; 
    } 
} 

XAML

<TabControl.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal"> 
      <StackPanel.Resources> 
       <Style x:Key="CanSaveIndicatorHeader"> 
        <Style.Triggers> 
         <Trigger Property="vm:EditorTabViewModel.CanSave" Value="true"> 
          <Setter Property="TextBlock.FontWeight" Value="Bold" /> 
         </Trigger> 
         <Trigger Property="vm:EditorTabViewModel.CanSave" Value="false"> 
          <Setter Property="TextBlock.Foreground" Value="Red" /> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </StackPanel.Resources> 
      <TextBlock Text="{Binding TabTitle}" Padding="0,0,10,0" Style="{StaticResource CanSaveIndicatorHeader}" /> 
      <Button Content="X" Command="{Binding CloseCommand}" FontSize="10" FontWeight="Bold" Padding="3,0"> 
      </Button> 
     </StackPanel> 
    </DataTemplate> 
</TabControl.ItemTemplate> 

Объект TextBlock всегда красный пу полужирный

UPDATE: префикс заголовка вкладки с помощью *

<StackPanel Orientation="Horizontal"> 
    <TextBlock Text="* " x:Name="TabTitleSaveIndicator" Visibility="Collapsed" /> 
    <TextBlock Text="{Binding TabTitle}" x:Name="TabTitle" Padding="0,0,10,0" /> 
    <Button Content="X" Command="{Binding CloseCommand}" FontSize="10" FontWeight="Bold" Padding="3,0"> 
    </Button> 
</StackPanel> 
<DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding CanSave}" Value="True"> 
     <Setter TargetName="TabTitle" Property="FontWeight" Value="Bold" /> 
     <Setter TargetName="TabTitleSaveIndicator" Property="Visibility" Value="Visible" /> 
    </DataTrigger> 
</DataTemplate.Triggers> 

ответ

3

TextBlock не имеет свойства «vm: EditorTabViewModel.CanSave», поэтому триггеры стиля игнорируются. Используйте DataTriggers вместо:

public class TabItemModel : INotifyPropertyChanged 
{ 
    public string TabTitle { get; set; } 

    private bool canSave; 

    public bool CanSave 
    { 
     get { return canSave; } 
     set 
     { 
      canSave = value; 
      OnPropertyChanged("CanSave"); 
     } 
    } 
//... 
} 

Tab шаблона элемента:

<TabControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock x:Name="text" Text="{Binding TabTitle}" Padding="0,0,10,0"/> 
       <Button Content="X" Command="{Binding CloseCommand}" FontSize="10" FontWeight="Bold" Padding="3,0"> 
       </Button> 
      </StackPanel> 
      <DataTemplate.Triggers> 
       <DataTrigger Binding="{Binding CanSave}" Value="true"> 
        <Setter TargetName="text" Property="TextBlock.FontWeight" Value="Bold" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding CanSave}" Value="false"> 
        <Setter TargetName="text" Property="TextBlock.Foreground" Value="Red" /> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
+0

обновление: Я нашел возможный способ сделать это в моем обновлении –

0

я могу указать на две вещи в вашем коде -

1 Ваш стиль отсутствует TargetType -

TargetType = "TextBlock"

также, вы используете свойство в вашем триггером, который выглядит не так со мной, вы должны использовать DataTrigger как этот

<DataTrigger Binding="{Binding Path=CanSave}" Value="true"> 
  • если оба CanSave и TabTitle свойства находятся в той же VM.

2 Ваше содержание недвижимости нуждается только в этом

public string Content 
    { 
     get { return _content; } 
     set 
     { 
       if (CanSave == false) 
       { 
       CanSave=true; 
       } 
       _content = value; 
     } 
    } 
Смежные вопросы