我使用的是自定义控件,其扩展状态依赖于从外部传递的参数。代码如下:
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中的扩展器无法更新。
答案 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。