2010-09-20 27 views
7

Tôi đã ràng buộc các DataContext của Window sau để mã phía sau để cho tôi một MVVM style để chứng minh hành vi này:Nút radio WPF - MVVM - ràng buộc dường như chết?

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <StackPanel> 
     <RadioButton GroupName="test" Content="Monkey" IsChecked="{Binding IsMonkey}"/> 
     <RadioButton GroupName="test" Content="Turtle" IsChecked="{Binding IsTurtle}" /> 
    </StackPanel> 
</Window> 

Heres mã sau:

public partial class Window1 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private bool _isMonkey; 
    public bool IsMonkey 
    { 
     get { return _isMonkey; } 
     set 
     { 
      _isMonkey = value; 
     } 
    } 

    private bool _isTurtle; 
    public bool IsTurtle 
    { 
     get { return _isTurtle; } 
     set 
     { 
      _isTurtle = value; 
     } 
    } 
} 

Đưa một breakpoint trên tập hợp của IsMonkeyIsTurtle và sau đó chạy ứng dụng và chọn IsMonkeyIsTurtle sau mỗi khác tôi thấy rằng nó hoạt động cho lựa chọn đầu tiên của mỗi điều khiển, trên lựa chọn thứ hai ràng buộc b Rò rỉ và các điểm ngắt không còn được kích hoạt?

Bất kỳ ai cũng có thể chỉ cho tôi đúng hướng không?

Trả lời

10

Ví dụ của bạn không có thông báo đã thay đổi. Bài viết của bạn chỉ là một ví dụ cho việc xây dựng MVVM. Vì vậy, tôi giả sử, bạn đã thực hiện INotifyPropertyChanged hoặc các thuộc tính là DependencyProperties. Nếu không, điều đầu tiên bạn phải làm là thay đổi thông báo.

Nếu bạn có thông báo thay đổi, đặt tên nhóm khác nhau cho RadioButton (tên khác cho từng trường hợp). Điều này decouples họ và ràng buộc sẽ không bị phá vỡ nữa.

<StackPanel> 
    <RadioButton GroupName="test1" Content="Monkey" IsChecked="{Binding IsMonkey}"/> 
    <RadioButton GroupName="test2" Content="Turtle" IsChecked="{Binding IsTurtle}" /> 
</StackPanel> 

Tùy thuộc vào việc kê khai tài sản của bạn, nó cũng có thể đầy ý nghĩa tuyên bố TwoWay Binding.

IsChecked="{Binding IsMonkey,Mode=TwoWay} 

Hy vọng điều này sẽ hữu ích.

+0

Xin chào, cảm ơn - giúp nó hoạt động thông qua các tên nhóm khác nhau như bạn đã đề xuất và một số mã trên thuộc tính. Mặc dù nó gây phiền nhiễu, vì nó là cùng một nhóm - vì vậy tôi muốn sử dụng chức năng đó, nhưng nó sẽ không cho phép tôi. –

+0

'cung cấp cho các nhóm RadioButtons các tên nhóm khác nhau' Chúa ơi, Bạn đã cứu mông của tôi. – user1112008

2

Đây là sự cố đã biết với các nút radio WPF; kiểm tra các bài viết để biết thêm chi tiết và cách giải quyết -

WPF RadioButtons và dữ liệu ràng buộc: http://geekswithblogs.net/claraoscura/archive/2008/10/17/125901.aspx

sự cẩn thận WPF Đài phát thanh nút liên kết (Enums và sửa lỗi): http://inquisitorjax.blogspot.com/2009/02/wpf-radio-button-binding-enums-and-bug.html

RadioButton bindings không được kiểm soát vấn đề vẫn không được giải quyết? http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8eb8280a-19c4-4502-8260-f74633a9e2f2/

+0

Cảm ơn thông tin. –

0

Sự cố này đã được khắc phục trong WPF 4.0, tôi đang tận dụng hành vi này trong dự án của riêng tôi ngay bây giờ. Chỉ cần đặt các nút radio vào cùng một nhóm, không còn cần phải sử dụng các tên nhóm khác nhau. Các ràng buộc sẽ không bị hỏng ... trên thực tế nút radio "không được chọn" sẽ có giá trị ràng buộc được đặt thành false như mong đợi.

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