代码之家  ›  专栏  ›  技术社区  ›  sourcenouveau

WPF中ToggleButton的IsChecked属性的单向绑定

  •  8
  • sourcenouveau  · 技术社区  · 14 年前

    我有一个 ToggleButton IsChecked 属性绑定到使用单向绑定的属性。

    <ToggleButton
        Command="{Binding Path=SomeCommand}"
        IsChecked="{Binding Path=SomeProperty, Mode=OneWay}" />
    

    这个 SomeCommand 切换布尔值 SomeProperty PropertyChanged 为引发事件 某些属性 .

    如果我改变 某些属性 在我的视图中,模型 切换按钮 切换按钮 绑定似乎丢失了,按钮不再根据

    5 回复  |  直到 14 年前
        1
  •  7
  •   Wallstreet Programmer    14 年前

    这是在使用单向数据绑定时设计的。添加附加属性PresentationTraceSources.TraceLevel=高你会看到它什么时候断开。此链接也描述了问题(不提供任何解决方案): Debugging Data Binding in WPF

        2
  •  13
  •   Alex_P    12 年前

    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将如下所示:

    <ToggleButton Command="{Binding Path=SomeCommand}"
                  TBFix:TBExtender.IsChecked="{Binding Path=SomeProperty,
                                                       Mode=OneWay}" />
    

    编辑:OP解决方案不起作用,因为当按下按钮时,IsChecked属性会在代码中设置(这是MS实现ToggleButton控件的方式)-设置属性会删除其中的绑定,因此它会停止工作。

    通过使用attached属性,我们可以克服这个问题,因为它在代码中从来没有赋值,所以绑定保持不变。

        3
  •  1
  •   Sinatr    9 年前

    它是 “装订好像丢了” 那个命令

    问题是什么 IsChecked SomeProperty 用户(如果用户按下按钮,他将改变 ,但绑定是 OneWay 所以 某些属性

    所以你可能 SomeProperty == false 但是按钮 IsChecked == true 反之亦然。

    有了它已经拥有的价值,那么什么也不会发生。

    SomeProperty = !set;
    SomeProperty = set;
    

    哪里 set 是您需要的值(例如,与当前值相反 某些属性 ).

        4
  •  1
  •   raistlin    7 年前

    解决这个问题的另一个简单方法是删除mode=oneway并实现一个空setter。前任:

        bool _MyIsEnabled;
        public bool MyIsEnabled
        {
            get { return _MyIsEnabled; }
            set { }
        }
    

        5
  •  0
  •   sourcenouveau    14 年前

    我认为问题归根结底是命令和命令之间的冲突 IsChecked 结合。我的解决方案是更改viewmodel以公开 bool? 已检查 ToggleButton . 在代码的其他地方,我想切换我使用的属性 SomeCommand .