簡體   English   中英

CheckBox.AutoCheck在wpf中

[英]CheckBox.AutoCheck in wpf

在WPF checkBox.AutoCheck = false最簡單方法是什么? 特別是防止CheckBox 在點擊時更改IsChecked

CheckBox 應對點擊Command和/或InputBindings做出反應 ,但不應嘗試在左鍵單擊或Space鍵上更改其可視狀態。

我可以通過使用Mode=OneWay來防止綁定屬性更改,但這似乎對視覺狀態沒有影響, CheckBox然后在我的屬性為false被檢查,這讓我很難過......

這是一個復選框的示例:

<!-- make this checkbox behave as if AutoCheck = false -->
<CheckBox IsChecked="{Binding IsChecked, Mode=OneWay}"
          Command="{Binding CommandLeftButtonOrSpace}">
    <CheckBox.InputBindings>
        <MouseBinding MouseAction="RightClick"
            Command="{Binding CommandRightButton}" />
    </CheckBox.InputBindings>
</CheckBox>

一個簡單的附加行為就可以了

public class CheckBoxBehavior
{
    public static bool GetDisableAutoCheck(DependencyObject obj) => (bool)obj.GetValue(DisableAutoCheckProperty);
    public static void SetDisableAutoCheck(DependencyObject obj, bool value) => obj.SetValue(DisableAutoCheckProperty, value);

    public static readonly DependencyProperty DisableAutoCheckProperty =
        DependencyProperty.RegisterAttached("DisableAutoCheck", typeof(bool),
        typeof(CheckBoxBehavior), new PropertyMetadata(false, (d, e) =>
        {
            var checkBox = d as CheckBox;
            if (checkBox == null)
                throw new ArgumentException("Only used with CheckBox");
            if ((bool)e.NewValue)
                checkBox.Click += DisableAutoCheck_Click;
            else
                checkBox.Click -= DisableAutoCheck_Click;
        }));

    private static void DisableAutoCheck_Click(object sender, RoutedEventArgs e) =>
        ((CheckBox)sender).IsChecked = !((CheckBox)sender).IsChecked;
}

像這樣設置

<ComboBox local:CheckBoxBehavior.DisableAutoCheck="True" ... />

您可以通過繼承控件(來自另一個答案 )來防止它首先切換:

public class OneWayCheckBox : CheckBox
{
    private class CancelTwoWayMetadata : FrameworkPropertyMetadata
    {
        protected override void Merge(PropertyMetadata baseMetadata, DependencyProperty dp)
        {
            base.Merge(baseMetadata, dp);

            BindsTwoWayByDefault = false;
        }
    }

    static OneWayCheckBox()
    {
        // Remove BindsTwoWayByDefault
        IsCheckedProperty.OverrideMetadata(typeof(OneWayCheckBox), new CancelTwoWayMetadata());
    }

    protected override void OnToggle()
    {
        // Do nothing.
    }
}

這也會切換IsChecked的綁定類型,因此您無需記住將Mode=OneWay置於其上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM