Свойство зависимости не обновляется? - PullRequest
2 голосов
/ 19 октября 2010

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

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 всегда красный nv жирный

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>

Ответы [ 2 ]

3 голосов
/ 19 октября 2010

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");
        }
    }
//...
}

Шаблон элемента вкладки:

<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 голосов
/ 19 октября 2010

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

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

TargetType = "TextBlock"

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

<DataTrigger Binding="{Binding Path=CanSave}" Value="true"> 
  • , если оба свойства CanSave и TabTitle находятся в одной виртуальной машине.

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

 public string Content  
    {  
         get { return _content; }  
         set  
         {  
              if (CanSave == false)  
              {  
                 CanSave=true;  
              }   
              _content = value;  
         }  
     }
...