WPF:DependencyProperty属性绑定问题

时间:2018-04-02 08:59:28

标签: wpf data-binding dependency-properties

我使用的是自定义控件,其扩展状态依赖于从外部传递的参数。代码如下:

myControl.xaml:

<Expander x:Name="Expander" Grid.Row="1" IsExpanded="True">

myControl.xaml.cs:

public partial class myControl: UserControl{
public myControl()
    {
        InitializeComponent();       
    }
public static readonly DependencyProperty IsExpandAllProperty =
            DependencyProperty.Register("IsExpandAll", typeof(bool), typeof(myControl), new PropertyMetadata(new PropertyChangedCallback(OnIsExpandAllChanged)));

public bool IsExpandAll
        {
            get { return (bool)GetValue(IsExpandAllProperty); }
            set
            {
                SetValue(IsExpandAllProperty, value);
            }
        }

private static void OnIsExpandAllChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            myControl rv = sender as myControl;                
            rv.Expander.IsExpanded = System.Convert.ToBoolean(e.NewValue.ToString());
        }

在xaml之外:

<DataTemplate>
  <view:myControl IsExpandAll="{Binding ExpandAllItems}"/>
</DataTemplate>
<Button Click="Button_Click"></Button>

外部viewModel:

 private bool _expandAllItems = true;
 public bool ExpandAllItems
    {
        get { return _expandAllItems; }
        set
        {
            _expandAllItems= value;
            OnPropertyChanged("ExpandAllItems");
        }
    }

在xaml.cs之外

private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        vm.ExpandAllItems= !vm.ExpandAllItems;
    }

我使用按钮单击事件更改ExpandAllItems值,但在调试时,我发现永远不会调用IsExpandAll属性setter,myControl中的扩展器无法更新。

1 个答案:

答案 0 :(得分:0)

我整理了一些代码来探索这里发生了什么。 我有一个用户控件和一个togglebutton。 显然,这只是一个实验,所以他们做不了多少。 因为我希望通过绑定来驱动dp的变化,所以我可以将其绑定到togglebutton上的缺血症。 这实际上是一个布尔?所以我让我的dp成为一个博尔?匹配那个。

在Mainwindow中,只需绑定togglebutton ischecked:

    <StackPanel>
        <local:UserControl1 IsExpandAll="{Binding ElementName=tb, Path=IsChecked}"/>
        <ToggleButton Name="tb" Content="Expandall"/>
    </StackPanel>

我的UserControl1只有一个网格 - 唯一的目的是探索这个dp

    public UserControl1()
    {
        InitializeComponent();
    }



    public bool? IsExpandAll
    {
        get { return (bool?)GetValue(IsExpandAllProperty); }
        set {
            SetValue(IsExpandAllProperty, value);
        }
    }
    public static readonly DependencyProperty IsExpandAllProperty =
        DependencyProperty.Register("IsExpandAll", typeof(bool?), typeof(UserControl1),   new PropertyMetadata(new PropertyChangedCallback(OnIsExpandAllChanged)));

    private static void OnIsExpandAllChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        UserControl1 rv = sender as UserControl1;
        Debugger.Break();
       // rv.Expander.IsExpanded = System.Convert.ToBoolean(e.NewValue.ToString());
    }

当我旋转它时,它首先击中休息因为dp已设置。 继续... 单击togglebutton并再次点击中断。 删除该断点并在设置器上放置一个断点。 这根本不会受到打击。 原因是绑定不使用setter。

相关问题