Vinculando à propriedade estática

Estou tendo dificuldade em vincular uma propriedade de string estática simples a uma checkbox de texto.

Aqui está a class com a propriedade estática:

public class VersionManager { private static string filterString; public static string FilterString { get { return filterString; } set { filterString = value; } } } 

No meu xaml, eu só quero ligar esta propriedade estática a uma checkbox de texto:

      

Tudo compila, mas em tempo de execução, recebo a seguinte exceção:

Não é possível converter o valor no atributo ‘Source’ para o object do tipo ‘System.Windows.Markup.StaticExtension’. Erro no object ‘System.Windows.Data.Binding’ no arquivo de marcação ‘BurnDisk; component / selectversionpagefunction.xaml’ Line 57 Position 29.

Alguma ideia do que estou fazendo errado?

Se a binding precisar ser bidirecional, você deve fornecer um caminho. Há um truque para fazer uma binding bidirecional em uma propriedade estática, desde que a class não seja estática: declare uma ocorrência fictícia da class nos resources e use-a como a origem da binding.

    ...  

Você não pode se ligar a uma estática assim. Não há como a infra-estrutura de binding ser notificada de atualizações, pois não há nenhum DependencyObject (ou instância de object que implemente INotifyPropertyChanged ) envolvido.

Se esse valor não mudar, simplesmente deixe de lado a binding e use x:Static diretamente dentro da propriedade Text . Defina o app abaixo como local de namespace (e assembly) da class VersionManager.

  

Se o valor mudar, sugiro criar um singleton para conter o valor e vincular a ele.

Um exemplo do singleton:

 public class VersionManager : DependencyObject { public static readonly DependencyProperty FilterStringProperty = DependencyProperty.Register( "FilterString", typeof( string ), typeof( VersionManager ), new UIPropertyMetadata( "no version!" ) ); public string FilterString { get { return (string) GetValue( FilterStringProperty ); } set { SetValue( FilterStringProperty, value ); } } public static VersionManager Instance { get; private set; } static VersionManager() { Instance = new VersionManager(); } } 
  

No .NET 4.5 é possível vincular a propriedades estáticas, leia mais

Você pode usar propriedades estáticas como a origem de uma binding de dados. O mecanismo de vinculação de dados reconhece quando o valor da propriedade é alterado se um evento estático é gerado. Por exemplo, se a class SomeClass define uma propriedade estática chamada MyProperty, SomeClass pode definir um evento estático que é gerado quando o valor de MyProperty é alterado. O evento estático pode usar uma das seguintes assinaturas:

 public static event EventHandler MyPropertyChanged; public static event EventHandler StaticPropertyChanged; 

Observe que, no primeiro caso, a class expõe um evento estático denominado PropertyNameChanged que passa EventArgs para o manipulador de events. No segundo caso, a class expõe um evento estático chamado StaticPropertyChanged que passa PropertyChangedEventArgs para o manipulador de events. Uma class que implementa a propriedade estática pode optar por aumentar as notifications de alteração de propriedade usando qualquer método.

Você pode usar a class ObjectDataProvider e sua propriedade MethodName . Pode ser assim:

    

O provedor de dados do object declarado pode ser usado assim:

  

A partir do WPF 4.5, você pode vincular-se diretamente a propriedades estáticas e fazer com que a binding seja atualizada automaticamente quando sua propriedade for alterada. Você precisa conectar manualmente um evento de alteração para acionar as atualizações de binding.

 public class VersionManager { private static String _filterString; ///  /// A static property which you'd like to bind to ///  public static String FilterString { get { return _filterString; } set { _filterString = value; // Raise a change event OnFilterStringChanged(EventArgs.Empty); } } // Declare a static event representing changes to your static property public static event EventHandler FilterStringChanged; // Raise the change event through this static method protected static void OnFilterStringChanged(EventArgs e) { EventHandler handler = FilterStringChanged; if (handler != null) { handler(null, e); } } static VersionManager() { // Set up an empty event handler FilterStringChanged += (sender, e) => { return; }; } } 

Agora você pode vincular sua propriedade estática como qualquer outra:

  

Se você estiver usando resources locais, você pode se referir a eles como abaixo:

  

Pode haver duas formas / syntax para ligar uma propriedade static . Se p é uma propriedade static na class MainWindow , a binding para a textbox de textbox será:

1

  

2

  

Olhe para o meu projeto CalcBinding , que fornece a você escrever expressões complexas no valor da propriedade Path, incluindo propriedades estáticas, propriedades de código-fonte, Math e outras. Então, você pode escrever isto:

  

Boa sorte!