2009-06-26 31 views
10

Tôi có một nút trên biểu mẫu của tôi chỉ nên được bật khi một mục được chọn trong một lần xem trang (hoặc chế độ xem danh sách trong một tabitem). Khi một mục được chọn, giá trị của nó được lưu trữ trong một biến thành viên chuỗi.WPF Data Binding: bật/tắt điều khiển dựa trên nội dung của var?

Tôi có thể ràng buộc thuộc tính IsEnabled của nút với nội dung của thành viên var không? Nghĩa là, nếu var thành viên không rỗng, hãy kích hoạt nút.

Tương tự, khi nội dung của thành viên var thay đổi (được đặt hoặc xóa), trạng thái của nút sẽ thay đổi.

Trả lời

11

Vì bạn có thể tìm cách liên kết thuộc tính IsEnabled của nút dựa trên chuỗi, hãy thử tạo một trình biến đổi cho nó.

Ie ...


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

và bộ chuyển đổi:

 

[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: Kể từ khi OP muốn để ràng buộc vào một biến, một cái gì đó như thế này cần phải được thực hiện:

 

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

} 
 

Sau đó, thay đổi biểu thức ràng buộc ở trên thành:

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

Lưu ý, bạn PHẢI triển khai INotifyPropertyChanged cho giao diện người dùng của mình để được cập nhật.

+0

Cảm ơn bạn đã trả lời. Tôi gặp lỗi trong xaml của tôi trên dòng này: "Loại địa phương: StringToBoolConverter không được tìm thấy." StringToBoolConverter là tên của lớp chuyển đổi của tôi. Tôi có cần phải đủ điều kiện nó với một không gian tên? – Number8

+0

OK. Vấn đề không gian tên trong xaml. – Number8

+0

Hmm. Tôi nghĩ rằng điều này là không đầy đủ; có vẻ như cần phải có một số loại sự kiện được nâng lên bởi thuộc tính thành viên mà Nút phản hồi, vì vậy khi thuộc tính thành viên bị thay đổi, trạng thái Bật của nút sẽ thay đổi. – Number8

6

Bạn có một ViewModel đang giữ thuộc tính chuỗi của bạn được đặt làm DataContext của Chế độ xem nơi bạn cố gắng thực hiện Ràng buộc này không?

Sau đó, những điều sau đây sẽ làm việc:

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

Sau đó, bạn nên làm một cái gì đó như thế này trong mã đằng sau của quan điểm:

this.DataContext = new MyClass(); 

Và một ví dụ XAML:

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

Thuộc tính chuỗi nằm trong lớp cửa sổ chính của tôi. Có cách nào để làm cho nó hoạt động trong trường hợp này? Ngay bây giờ, phương thức HasContent() không được gọi; Tôi nghi ngờ nó đã làm với DataContext không nhận được thiết lập. – Number8

+0

Điều gì khiến nút gọi HasContent() để đặt trạng thái của nó? Ngoài ra, tôi không có quyền kiểm soát mà nhận được giá trị của chuỗi. IsEnabled có cần thuộc tính UpdateSourceTrigger không? – Number8

+0

Nếu cửa sổ có các thuộc tính đó, bạn có thể đặt nó làm DataContext của riêng nó như: this.DataContext = trong Sự kiện được tải xuống của Windows. Tuy nhiên đây là thực hành rất xấu. Bạn nên xem xét có một ViewModel giống như một trong mẫu của tôi thiết lập như DataContext. Lưu ý HasContent không phải là một phương thức, thuộc tính của nó, chỉ cho các thuộc tính có thể được ràng buộc với view.Its getter được đánh giá mỗi lần bạn nâng cao PropertyChanged với tên thuộc tính cụ thể. UpdateSourceTrigger chủ yếu là cần thiết cho TextBoxes để viết textchanges của họ trở lại tài sản bị ràng buộc với mỗi phím gõ. Khác họ làm điều này trên tập trung bị mất – Andrej

Các vấn đề liên quan