2009-06-26 13 views
10

Formumda yalnızca bir ağaç görünümünde (veya bir tabitemde liste görünümünde) bir öğe seçildiğinde etkinleştirilmesi gereken bir düğme var. Bir öğe seçildiğinde, değer bir string üye değişkeninde saklanır.WPF Veri Bağlama: Var'ın içeriğine dayalı bir kontrolü etkinleştirin/devre dışı bırakın.

Düğmenin IsEnabled özelliğini, üye var içeriğine bağlayabilir miyim? Yani, eğer varman boş değilse, butonu etkinleştirin.

Benzer şekilde, üye varyasının içeriği değiştiğinde (ayarlanmış veya silinmiş), düğmenin durumu değişmelidir.

cevap

11

Düğümün düğmesinin IsEnabled özelliğini bir dize temel alarak bağlayacağınız için, bunun için bir dönüştürücü yapmayı deneyin.

Yani ...


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

ve dönüştürücü:

 

[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; 
     } 
    } 
 

DÜZENLEME: OP bir değişkene bağlamak istedik beri böyle bir şey yapılması gerekiyor:

 

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)); 
      } 
     } 

} 
 

Daha sonra yukarıdaki ciltleme ifadesini şu şekilde değiştirin:

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

Not, güncellenmesi için kullanıcı arabiriminiz için INotifyPropertyChanged uygulamanız GEREKİR.

+0

Cevabınız için teşekkür ederiz. Bu hat üzerinde benim xaml bir hata alıyorum: "Yerel türü: StringToBoolConverter bulunamadı." StringToBoolConverter, dönüştürücü sınıfımın adıdır. Bir isim alanıyla nitelendirmem gerekiyor mu? – Number8

+0

Anladım. Xaml'deki ad alanı sorunu. – Number8

+0

Hmm. Bunun eksik olduğunu düşünüyorum; Button özelliği yanıtlandığında üye özelliği tarafından yükseltilen bir çeşit olay olması gerektiği gibi görünüyor, bu nedenle üye özelliği değiştirildiğinde düğmenin Etkin durumu değişecektir. – Number8

6

Dizesi özellik kümenizi, bu Bağlamı yapmaya çalıştığınız Görünümün DataContext'i olarak ayarlanmış bir ViewModel'iniz var mı?

Ardından aşağıdaki çalışır:

// 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)); 
    } 
} 
Sonra

Eğer bakış kodda böyle bir şey yapmalıydım:

this.DataContext = new MyClass(); 

Ve Xaml Örneğin:

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

Dize özelliği ana pencere sınıfımda. Bu durumda çalışmasını sağlamanın bir yolu var mı? Şu anda, HasContent() yöntemi çağrılmıyor; DataContext ile ayarlanmaması gerektiğinden şüpheleniyorum. – Number8

+0

Düğme, HasContent() öğesini durumunu ayarlamak için neden çağırır? Ayrıca, dizenin değerini alan hiçbir denetimim yok. IsEnabled'ın UpdateSourceTrigger özniteliğine ihtiyacı var mı? – Number8

+0

Pencere bu özelliklere sahipse, bunu kendi DataContext gibi ayarlayabilirsiniz: this.DataContext = Bu , Windows Loaded Event'de. Ancak bu çok kötü bir uygulamadır. Numune kümemde DataContext gibi bir ViewModel bulundurmayı düşünmelisiniz. Not HasContent bir yöntem değildir, yalnızca bir Özelliğe ait özellikler görünümüne bağlı olabilir. PropertyChanged'ı belirli bir özellik adıyla her yükselttiğinizde getter değeri değerlendirilir. UpdateSourceTrigger, TextBox'ların metin yazımlarını her bir yazılan anahtarla bağlı özelliğe geri yazması için gereklidir. Else bunu kayıp odakta yaparlar – Andrej

İlgili konular