【发布时间】: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