Có một cách đơn giản và thanh lịch để giải quyết vấn đề các poster gốc - thay thế tài sản IsChecked của ToggleButton với một tài sản gắn thêm rằng sẽ thiết lập IsChecked của nút trong xử lý sự thay đổi của nó:
namespace TBFix
{
public class TBExtender
{
public static readonly DependencyProperty IsCheckedProperty =
DependencyProperty.RegisterAttached("IsChecked",
typeof(bool),
typeof(TBExtender),
new PropertyMetadata(OnChanged));
public static bool GetIsChecked(DependencyObject obj)
{
return (bool)obj.GetValue(IsCheckedProperty);
}
public static void SetIsChecked(DependencyObject obj, bool value)
{
obj.SetValue(IsCheckedProperty, value);
}
private static void OnChanged(DependencyObject o,
DependencyPropertyChangedEventArgs args)
{
ToggleButton tb = o as ToggleButton;
if (null != tb)
tb.IsChecked = (bool)args.NewValue;
}
}
}
XAML sau đó sẽ giống như thế này:
<ToggleButton Command="{Binding Path=SomeCommand}"
TBFix:TBExtender.IsChecked="{Binding Path=SomeProperty,
Mode=OneWay}" />
EDIT: giải pháp OP không hoạt động, vì khi nút được nhấn tài sản IsChecked được thiết lập trong các mã (đây là cách MS thực hiện kiểm soát ToggleButton) - thiết lập tài sản loại bỏ ràng buộc fr om nó và nó ngừng hoạt động.
Bằng cách sử dụng thuộc tính đính kèm, chúng tôi có thể khắc phục vấn đề này bởi vì nó không bao giờ được gán giá trị bằng mã và do đó các ràng buộc vẫn nguyên vẹn.
Nguồn
2011-04-28 17:21:17
SomeCommand của bạn làm gì? Tôi có một số ToggleButtons làm điều tương tự, với cùng một loại ràng buộc, và tất cả SomeCommand làm là phủ nhận giá trị hiện tại của SomeProperty. –
SomeProperty thực sự là một loại khác và tôi đã sử dụng một công cụ chuyển đổi để thay đổi nó thành một boolean. Tôi bỏ điều đó ra để làm cho câu hỏi trở nên đơn giản hơn. –