A NullReferenceException
бросается, когда мы пытаемся получить доступ к свойствам нулевого объекта или когда значение строки становится пустым, и мы пытаемся получить доступ к строковым методам.
Например:
string str = string.Empty;
str.ToLower(); // throw null reference exception
Public Class Person {
public string Name { get; set; }
}
Person objPerson;
objPerson.Name /// throw Null refernce Exception
Это обычное приоритет значения свойства зависимостей . Установка его на изображение находится на # 3, а в триггере стиля - более низкий приоритет # 6.
Вы можете сделать это вместо:
<Image Name="image1" Stretch="Uniform" Source="/Affinity;component/Images/affinity_logo.png">
<Image.Style>
<Style TargetType="Image">
<Setter Property="Visibility" Value="Hidden" />
<Style.Triggers>
<DataTrigger Binding="{Binding Items.Count, ElementName=tabcontrolworkspaces}"
Value="0">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
Задайте свою видимость в стиле в дополнение к триггеру
. Я встречал это странное поведение с DataTriggers много раз, где иногда DataTrigger Setters не будут вступать в силу, если сеттер также не определен в Стиль.
Не работает
<Image Visibility="Collapsed">
<Image.Style>
<Style TargetType="Image">
<Style.Triggers>
<DataTrigger Binding="{Binding Something}" Value="0">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
<Image.Style>
</Image>
Будет работать
<Image>
<Image.Style>
<Style TargetType="Image">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding Something}" Value="0">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
<Image.Style>
</Image>
Изменить: см. принятый ответ для объяснения причин, почему это не работает. Он связан с порядком, в котором определяются свойства зависимостей, где свойства, определенные в <Tag>
, всегда имеют приоритет над запущенными значениями.
Когда триггер верен, он изменяет значение на желаемое значение. Когда он больше не верен, он возвращает значение предыдущему значению. Это не изменит его на значение, которое оно не будет.
Это означает, что если исходное значение будет видимым и вы измените его на видимое, когда триггер больше не активен, значение вернется назад к видимым.