2008-12-21 10 views
7

Ich habe im Internet einige Beispiele gesehen, wie ein Boolean mit der Visibility-Eigenschaft eines Steuerelements in XAML verknüpft werden kann. Die meisten guten Beispiele verwenden einen BooleanToVisibiliy-Konverter.Bindungssichtbarkeit in XAML zu einer Sichtbarkeitseigenschaft

Ich möchte nur die Visible-Eigenschaft auf das Steuerelement festlegen, um an eine System.Windows.Visibility-Eigenschaft im Code-Behind zu binden, aber es scheint nicht zu funktionieren.

Das ist mein XAML:

<Grid x:Name="actions" Visibility="{Binding Path=ActionsVisible, UpdateSourceTrigger=PropertyChanged}" /> 

Dies ist der Code für die Eigenschaft:

private Visibility _actionsVisible; 
public Visibility ActionsVisible 
{ 
    get 
    { 
     return _actionsVisible; 
    } 
    set 
    { 
     _actionsVisible = value; 
    } 
} 

Im Konstruktor des Fensters, ich habe auch diesen Aufruf:

base.DataContext = this; 

Wenn ich ActionsVisible oder this.actions.Visibility aktualisiere, wird der Status nicht übertragen. Irgendwelche Ideen, was schief gehen könnte?

+0

Sie müssen alle Steuerelemente auf dem Thread zugreifen, auf dem sie erstellt wurden. Sie können Steuerelemente aus anderen Threads aktualisieren, aber Sie müssen das Update über den UI-Thread mit dem WPF-Dispatcher bereitstellen. Dieser [Artikel] (http://msdn.microsoft.com/en-us/magazine/cc163328.aspx) sollte helfen. –

Antwort

7

Ich glaube, das Problem ist, dass WPF nicht wissen kann, dass sich Ihre ActionsVisible-Eigenschaft geändert hat, da Sie die Tatsache nicht gemeldet haben.

Ihre Klasse muss INotifyPropertyChanged implementieren, dann müssen Sie in Ihrer set-Methode für ActionsVisible das PropertyChanged-Ereignis mit ActionsVisible als geänderten Eigenschaftennamen auslösen.

Hope this helps ...

+0

Ich bin nicht dagegen, aber ich habe auch eine TextBox an eine String-Eigenschaft im Code-Behind gebunden und das funktioniert ohne das INotifyPropertyChanged-Ereignis. Ich dachte, dass ich, indem ich den UpdateSourceTrigger zu PropertyChanged setze, nicht den INotifyPropertyChanged verwenden müsste. – Jared

+0

Nicht sicher, wie es das dann macht! Möchtest du mehr von deinem Code posten? Die UpdateSourceTrigger-Eigenschaft steuert nur, wann die Quelle (d. H. Die Eigenschaft, an die Sie binden) aktualisiert wird. Es hat keine Auswirkungen auf Ihre Sichtbarkeitseigenschaften. –

+0

Danke Craig. Ich hätte bei meinem früheren Kommentar klarer sein sollen. Ich wollte sagen, dass die Text-Eigenschaft einer TextBox an eine String-Eigenschaft im Code-Behind gebunden ist. Das funktioniert und wenn Sie immer noch die Quelle dafür sehen wollen, lassen Sie es mich wissen. – Jared

8

Ihre Immobilie Ändern ein DependencyProperty zu sein. Dies übernimmt die Aktualisierung für Sie.

 public Visibility ActionsVisible 
    { 
     get { return (Visibility)GetValue(ActionsVisibleProperty); } 
     set { SetValue(ActionsVisibleProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for ActionsVisible. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ActionsVisibleProperty = 
     DependencyProperty.Register("ActionsVisible", typeof(Visibility), typeof(FooForm)); 
+0

Wenn Sie diesen Code in einem anderen Thread als dem Thread ausführen, der ihn besitzt, gibt es eine Ausnahme. Das Ganze, das ich in die Bindung verschoben habe, war, dass UI-Elemente von mehreren Threads aus aktualisiert werden können. Es scheint nicht so, als würde diese Lösung für mich funktionieren, wenn sie in einem einzigen Thread ausgeführt werden muss. – Jared

1

schreiben: NotifyPropertyChanged("ActionsVisible")