【问题标题】:WPF: DependencyProperty property binding issueWPF:DependencyProperty 属性绑定问题
【发布时间】:2018-04-02 08:59:27
【问题描述】:

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

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>

外部视图模型:

 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 属性设置器从未被调用,myControl 中的扩展器无法更新。

【问题讨论】:

  • ExpandAllItems 是如何定义的?以及如何使用按钮单击事件来更改它?
  • XAML 中的 IsExpandAllRanks 与 IsExpandAll 不同。否则,当我尝试一段类似的代码时,当我将其设为布尔值时,会命中 on change 处理程序而不是 setter?并绑定到一个togglebutton ischecked。绑定不使用设置器。取决于你正在做什么,这可能是你的设置器没有被调用的原因。
  • @ASh,谢谢,我已经编辑了问题。
  • @Andy,谢谢,有错字。我已经改正了。我不知道为什么不能调用setter。如何让它发挥作用?
  • 绑定不调用设置器。把你的逻辑放在 onchanged 中。或者在代码中显式调用 setter。

标签: wpf data-binding dependency-properties


【解决方案1】:

我整理了一些代码来探索这里发生了什么。 我有一个用户控件和一个切换按钮。 显然,这只是一个实验,所以他们做的不多。 因为我想通过绑定来驱动 dp 的更改,所以我绑定到切换按钮上的 ischecked。 这实际上是一个布尔?所以我让我的 dp 成为布尔值?匹配那个。

在主窗口中,只需绑定选中的切换按钮:

    <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 已设置。 继续... 单击切换按钮,它会再次中断。 删除该断点并在设置器上放置一个断点。 这永远不会被击中。 原因是绑定不使用 setter。

【讨论】:

  • @Sarina 你从这个答案中得到了什么?
  • @Clemens,我觉得你很精通 wpf,我首先需要解决我的问题,花了我几个小时,我是这个技术的新手,我感谢 Andy,他帮助了我实施它。我真的很感谢你们的cmets,你们给了我线索,它可以帮助我做更多的研究,我稍后会尝试。再次感谢。
  • @Sarina 我真的很好奇这个答案对你有什么帮助。只是调试?
猜你喜欢
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多