none
如何解决 AppBarToggleButton 位于自定义控件里时,属性 IsChecked 的绑定失效? RRS feed

  • 问题

  • 我将一个 AppBarToggleButtonIsChecked 设置如下(当我选中它时,能够使  MySplitView 展开 Pane,反之亦然):

            <AppBarToggleButton 
                                IsChecked="{Binding IsPaneOpen, ElementName=MySplitView, Mode=TwoWay}" />
    

    这个 AppBarToggleButton 如果处于 Page Grid 中,那么,当我点击它时,它能够实现这一作用:

    <Page> <Grid x:Name="LayoutRoot"> <AppBarToggleButton IsChecked="{Binding IsPaneOpen, ElementName=CommentSplitView, Mode=TwoWay}" />

    // 略。 <Grid> </Page>

    但当我把它放入自定义用户控件时,它 IsChecked 却不起作用了(能被选中,但没有实现应有的功能):

    <Page> <Grid x:Name="LayoutRoot">

    <control:MyContol>

    <control:MyControl.Content> // 这个 Content 属性是个 ContentPresenter <AppBarToggleButton IsChecked="{Binding IsPaneOpen, ElementName=CommentSplitView, Mode=TwoWay}" /> // 现在,当我选中它时,Pane 不在发生改变。

    <control:MyControl.Content>

    </control:MyContol>

    // 略。 <Grid> </Page>

    2016年2月3日 7:54

全部回复

  • <UserControl> <Grid> <ContentPresenter Content={x:Bind Content, Mode=OneWay}> // Content 为后台依赖属性, object 类型。

    // 略。 </Grid> </UserControl>

    其实就类似是个最简单的这种,代码应该没问题。其他成员的绑定都没问题,偏偏这个 IsChecked 绑定后选中按钮没反应。无奈,我只能反过来 IsPaneOpen 绑定 IsChecked 来达到目的了。

    如果这个问题本来就是这样(系统内部设计或无意设计的),那么你可以创建一个这样的最简单的控件测试下,问题应该会重现。

    2016年2月3日 10:53
  • 提供一个扩展属性:

    public class ToggleButtonProperties
        {
            public static readonly DependencyProperty IsCheckedProperty =
          DependencyProperty.RegisterAttached("IsChecked",
                                              typeof(bool),
                                              typeof(ToggleButtonProperties),
                                              new PropertyMetadata(false, 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;
            }
        }

    这样使用:

    commonControlHelper:ToggleButtonProperties.IsChecked="{Binding IsPaneOpen}"

    2016年3月14日 4:50