2009-06-26 1 views
10

Ich habe eine Schaltfläche in meinem Formular, die nur aktiviert werden sollte, wenn ein Element in einer Strukturansicht (oder der Listenansicht in einem Tab-Element) ausgewählt ist. Wenn ein Element ausgewählt ist, wird sein Wert in einer String-Member-Variablen gespeichert.WPF-Datenbindung: Aktivieren/Deaktivieren eines Steuerelements basierend auf dem Inhalt von var?

Kann ich die IsEnabled Eigenschaft der Schaltfläche an den Inhalt des Mitglieds var binden? Wenn das Element var nicht leer ist, aktivieren Sie die Schaltfläche.

In ähnlicher Weise sollte sich der Status der Schaltfläche ändern, wenn sich der Inhalt der Mitgliedsvariablen ändert (setzen oder löschen).

Antwort

11

Da Sie wahrscheinlich versuchen, die IsEnabled-Eigenschaft der Schaltfläche basierend auf einer Zeichenfolge zu binden, versuchen Sie, einen Konverter dafür zu erstellen.

Ie ...


<StackPanel> 
<StackPanel.Resources> 
<local:SomeStringConverter mystringtoboolconverter /> 
</StackPanel.Resources> 
<Button IsEnabled="{Binding ElementName=mytree, Path=SelectedItem.Header, Converter={StaticResource mystringtoboolconverter}}" /> 
<StackPanel> 

und der Wandler:

 

[ValueConversion(typeof(string), typeof(bool))] 
    class SomeStringConverter : IValueConverter { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
      string myheader = (string)value; 
      if(myhead == "something"){ 
       return true; 
      } else { 
       return false; 
      } 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
      return null; 
     } 
    } 
 

EDIT: Da die OP auf eine Variable binden wollte, so etwas wie dies getan werden muss:

 

public class SomeClass : INotifyPropertyChanged { 
    private string _somestring; 

    public string SomeString{ 
    get{return _somestring;} 
    set{ _somestring = value; OnPropertyChanged("SomeString");} 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) 
     { 
      if (this.PropertyChanged != null) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

} 
 

Dann ändern Sie den obigen Bindungsausdruck zu:

 
{Binding Path=SomeString, Converter={StaticResource mystringtoboolconverter}} 

Hinweis: Sie müssen INotifyPropertyChanged implementieren, damit Ihre Benutzeroberfläche aktualisiert wird.

+0

Danke für die Antwort. Ich erhalte einen Fehler in meiner XAML auf dieser Linie: "Der Typ local: StringToBoolConverter wurde nicht gefunden." StringToBoolConverter ist der Name meiner Konverterklasse. Muss ich es mit einem Namespace qualifizieren? – Number8

+0

Bekam es. Namespace-Problem in der XAML. – Number8

+0

Hmm. Ich denke, das ist unvollständig; Es sieht so aus, als müsste dort eine Art von Ereignis auftreten, das von der Eigenschaft member ausgelöst wurde, auf die die Schaltfläche reagiert. Wenn die Elementeigenschaft geändert wird, ändert sich der Status Enabled der Schaltfläche. – Number8

6

Haben Sie ein ViewModel, das Ihre Zeichenfolgeneigenschaft als den DataContext der Ansicht enthält, in der Sie versuchen, diese Bindung auszuführen?

Dann werden folgende Arbeiten:

// Example ViewModel 
public class MyClass : INotifyPropertyChanged 
{ 
    private string text; 

    public string Text 
    { 
     get { return text; } 
     set 
     { 
      text = value; 
      UpdateProperty("Text"); 
      UpdateProperty("HasContent"); 
     } 
    } 

    public bool HasContent 
    { 
     get { return !string.IsNullOrEmpty(text); } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 

    protected void UpdateProperty(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 
} 

Dann sollten Sie so etwas wie dies in den Code hinter der Ansicht getan haben:

this.DataContext = new MyClass(); 

und XAML-Beispiel:

<StackPanel> 
     <TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" /> 
     <Button IsEnabled="{Binding HasContent}"> 
      Click Me! 
     </Button> 
    </StackPanel> 
+0

Die Zeichenfolge-Eigenschaft ist in meiner Hauptfensterklasse. Gibt es eine Möglichkeit, es in diesem Fall funktionieren zu lassen? Im Moment wird die HasContent() -Methode nicht aufgerufen. Ich vermute, dass es damit zu tun hat, dass der DataContext nicht gesetzt wird. – Number8

+0

Was bewirkt, dass die Schaltfläche HasContent() aufruft, um den Status zu setzen? Auch habe ich keine Kontrolle, die den Wert der Zeichenfolge erhält. Benötigt IsEnabled das Attribut UpdateSourceTrigger? – Number8

+0

Wenn das Fenster diese Eigenschaften hat, könnten Sie es als seinen eigenen DataContext setzen wie: this.DataContext = diese im Windows Loaded-Event. Dies ist jedoch sehr schlechte Praxis. Sie sollten in Erwägung ziehen, ein ViewModel wie das in meinem Beispiel als DataContext festgelegt zu haben. Hinweis HasContent ist keine Methode, es ist eine Eigenschaft, da nur Eigenschaften an die Ansicht gebunden werden können. Ihr Getter wird jedes Mal ausgewertet, wenn Sie PropertyChanged mit dem spezifischen Eigenschaftsnamen anheben. UpdateSourceTrigger wird hauptsächlich für TextBoxes benötigt, um ihre Textänderungen mit jedem getippten Schlüssel zurück in die gebundene Eigenschaft zu schreiben. Sonst machen sie das auf verlorenem Fokus – Andrej