我有一个转换器,它接收bool,并将返回a或B,具体取决于它是true还是false。转换器根据bool选择正确的值,但仅在启动时,如果我在运行时更改bool,转换器不会更新。
基本上,我有一个用户控件,里面有一个按钮,这个按钮切换";IsOpen";属性,这是有效的。但我有一个multibinder,它将IsOpen绑定到(按钮的(Image,它将根据IsOpen切换图像。但它并没有更新,只是在开始时保持值。(IsOpen确实在点击时切换,这不是问题所在(
我进行多绑定的用户控制:
<v:IconButton ColorPalette="{StaticResource MilkySolid}" ColorPaletteFore="{StaticResource BlackToBrightPalette}" IconMargin="0" Content="" VerticalAlignment="Top" Margin="0" HorizontalAlignment="Left" FontSize="1" Height="26" IconWidth="26" Click="IconButton_Click">
<v:IconButton.Image>
<MultiBinding Converter="{StaticResource AorBConverter}">
<Binding Path="IsOpen"/>
<Binding Source="{StaticResource collapseBTN}"/>
<Binding Source="{StaticResource expandBTN}"/>
</MultiBinding>
</v:IconButton.Image>
</v:IconButton>
CodeBehind(此部分工作(
private void IconButton_Click(object sender, RoutedEventArgs e)
{
IsOpen = !IsOpen;
}
public bool IsOpen
{
get { return (bool)GetValue(IsOpenProperty); }
set { SetValue(IsOpenProperty, value); }
}
public static readonly DependencyProperty IsOpenProperty =
DependencyProperty.Register("IsOpen", typeof(bool),
typeof(ParamNodeV), new PropertyMetadata(false));
用户控件的视图模型(这也适用(
public bool IsOpen
{
get { return isOpen; }
set
{
isOpen = value;
OnPropertyChanged(nameof(IsOpen));
}
}
所以,就像我说的,转换器根据布尔值选择正确的图像。但是如果我在运行时更新bool值,它就不会更新。
如果你问我为什么不使用触发器:我试图从我的UserControl(ParamNodeV(更改CustomControl(IconButton(上的图像,我不知道如何从ParamNodeV访问IconButton的属性,而不完全覆盖样式/模板。因此,如果有人帮助我使用转换器,或者帮助我如何从UserControl导航到IconButton的Image属性,而不必覆盖样式/模板
表达式
<Binding Path="IsOpen"/>
将当前DataContext作为源对象。
在后面的代码中,您显然正在更改UserControl的IsOpen属性,它应该是一个不同的对象。
因此,绑定应该使用该属性作为源,即使用UserControl作为源对象:
<Binding Path="IsOpen" RelativeSource="{RelativeSource AncestorType=UserControl}"/>