WPF - триггер не срабатывает - PullRequest
1 голос
/ 29 октября 2009

У меня проблема при попытке сделать что-то, что должно быть так же просто, как. Я пытался использовать Trigger на основе DependencyProperty или DataTrigger - я не могу заставить их работать.

XAML для триггера:

<Style x:Key="FileWatchButton" BasedOn="{StaticResource {x:Type Button}}" TargetType="{x:Type Button}">
    <Style.Triggers>
        <Trigger Property="Main:Main.XmlFilesAvailableForLoading" Value="True">
            <Setter Property="Background" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>

И связанный код:

public static readonly DependencyProperty XmlFilesAvailableForLoadingProperty =
DependencyProperty.Register("XmlFilesAvailableForLoading", typeof(bool), typeof(Main));

public bool XmlFilesAvailableForLoading
{
    get
    {
        try
        {
            return (bool)this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.DataBind,
                    (System.Windows.Threading.DispatcherOperationCallback)delegate { return GetValue(XmlFilesAvailableForLoadingProperty); },
                    XmlFilesAvailableForLoadingProperty);
        }
        catch (Exception)
        {
            return (bool)XmlFilesAvailableForLoadingProperty.DefaultMetadata.DefaultValue;
        }
    }
    set
    {
        this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.DataBind,
                (System.Threading.SendOrPostCallback)delegate{ SetValue(XmlFilesAvailableForLoadingProperty, value); }, value);
    }
}

Обычно докладчик правильно устанавливает dp (он основан на FileSystemWatcher классе, который ищет один или несколько файлов), но Trigger не запускается. Это проблема с потоками?

Спасибо.

1 Ответ

1 голос
/ 29 октября 2009

Не ясно, завершен ли код, но похоже, что путь свойства в вашем триггере может быть неправильным. Имеет ли стилизуемая кнопка свойство Main? Я думаю, нет; похоже, вы пытаетесь вызвать свойство другого элемента, называемого Main - это верно?

В любом случае префикс пространства имен не требуется. Если у кнопки есть свойство с именем Main, вы можете обратиться к нему напрямую; если это не так, то префикс вам не поможет.

Я предполагаю, что вам, вероятно, нужен DataTrigger, привязка которого относится к элементу Main:

<local:Main Name="MyMain" ... />  <!-- this has the XmlFilesAvailableForLoading property -->

<DataTrigger Binding="{Binding XmlFilesAvailableForLoading, ElementName=MyMain}"
             Value=True>
  <Setter Property="Background" Value="Red" />
</DataTrigger>

На несвязанной ноте у вас должна быть любая некачественная реализация в вашем получателе и установщике DP. Помните, что система привязки и стиля будет обходить методы получения и установки и напрямую взаимодействовать с основным хранилищем. Поэтому я настоятельно рекомендую изменить их обратно на простые вызовы GetValue и SetValue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...