WPF UserControl 绑定 - OnPropertyChanged 调用函数
WPF UserControl Binding - OnPropertyChanged call Function
晚上好!
我已经阅读了多个关于绑定的线程,并认为我掌握了它(至少对于文本框、ObservableCollections 等)。
但是现在,我遇到了一个更复杂的问题,并且在某个地方迷路了:
我创建了一个 UserControl (STATUSBOX),包含标签等。
我像这样绑定这些标签:
<Label x:Name="c1" x:FieldModifier="private" Grid.Column="1"
Grid.Row="1" Height="20" Style="{StaticResource labelTable}"
Width="140" Content="{Binding Path= value1}" Margin="0,0,0,0" ></Label>
在后面的代码中,我是这样实现的:
public String value1
{
get { return (String)GetValue(ValueProperty1); }
set {
SetValue(ValueProperty1, value);
//setLightColor(1, value); //[I]
}
}
public static readonly DependencyProperty ValueProperty1 =
DependencyProperty.Register("value1", typeof(string),
typeof(UC_StatusBox_detailed), new PropertyMetadata(null));
效果很好。
但是现在,我尝试添加一个状态灯,它可以在绿-橙-红之间切换。因此,我创建了一个新的 UserControl (LAMPCONTROL) 来显示部分精灵图像:
<Border x:Name="frame" x:FieldModifier="private" Width="30" Height="30" Grid.Column="0"
Grid.Row="0" CornerRadius="4" BorderThickness="1">
<Rectangle Height="30" Width="30" Grid.Column="0"
HorizontalAlignment="Right" VerticalAlignment="Center">
<Rectangle.Fill>
<ImageBrush x:Name="imgBrush" x:FieldModifier="private" ViewboxUnits="Absolute" Viewbox="0,0, 30,30" ImageSource="/TestControl;component/Icons/spriteLight.png"/>
</Rectangle.Fill>
</Rectangle>
</Border>
我添加了以下方法:
private void UpdateLightStatus(Boolean statusOK)
{
int offset;
if (statusOK)
{
offset = 0;
}
else
{
offset = 30;
}
this.imgBrush.Viewbox = new Rect(offset, 0, 30, 30);
}
如果我使用它,那也行得通 "stand alone"。
但是,如果我尝试在我的 STATUSBOX 中实现它,我将无法使其正常工作...
我希望像这里 [I] 那样做一些事情,一切都完成了,但这不起作用。
在下一种方法中,我尝试在 LAMPCONTROL 中创建一个 DependencyProperty 与 STATUSBOX 中的 DependencyProperty 相同,并在 LAMPCONTROL 的 xaml 中添加一个绑定,从那时起我有点困惑。
问题 - 简而言之 - 是:如何调用子 UserControl 的方法
当 main-UserControl 的绑定 属性 更改时从 main-UserControl?
我希望我的问题有点容易理解,如果需要更多信息,我很乐意提供,但我不想让这个问题比现在更大...
感谢您阅读所有这些,并致以最诚挚的问候
法比安
克莱门斯让我走上了正确的方向。解决方法如下
How to call a method of a sub-UserControl from the main-UserControl when the bound property of the main-UserControl is changed?
您可以在主控件的 XAML 标记中给子控件一个 x:Name
:
<local:LampControl x:Name="subControl" />
然后您可以在主控件的代码隐藏中使用此名称访问它:
subControl.UpdateLightStatus(false);
克莱门斯让我走上了正确的方向。解决方法如下:
public static readonly DependencyProperty Value1Property =
DependencyProperty.Register("Value1", typeof(string),
typeof(UC_StatusBox_detailed), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender,
new PropertyChangedCallback(OnValueChanged)));
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//my code here
}
晚上好! 我已经阅读了多个关于绑定的线程,并认为我掌握了它(至少对于文本框、ObservableCollections 等)。 但是现在,我遇到了一个更复杂的问题,并且在某个地方迷路了:
我创建了一个 UserControl (STATUSBOX),包含标签等。 我像这样绑定这些标签:
<Label x:Name="c1" x:FieldModifier="private" Grid.Column="1"
Grid.Row="1" Height="20" Style="{StaticResource labelTable}"
Width="140" Content="{Binding Path= value1}" Margin="0,0,0,0" ></Label>
在后面的代码中,我是这样实现的:
public String value1
{
get { return (String)GetValue(ValueProperty1); }
set {
SetValue(ValueProperty1, value);
//setLightColor(1, value); //[I]
}
}
public static readonly DependencyProperty ValueProperty1 =
DependencyProperty.Register("value1", typeof(string),
typeof(UC_StatusBox_detailed), new PropertyMetadata(null));
效果很好。
但是现在,我尝试添加一个状态灯,它可以在绿-橙-红之间切换。因此,我创建了一个新的 UserControl (LAMPCONTROL) 来显示部分精灵图像:
<Border x:Name="frame" x:FieldModifier="private" Width="30" Height="30" Grid.Column="0"
Grid.Row="0" CornerRadius="4" BorderThickness="1">
<Rectangle Height="30" Width="30" Grid.Column="0"
HorizontalAlignment="Right" VerticalAlignment="Center">
<Rectangle.Fill>
<ImageBrush x:Name="imgBrush" x:FieldModifier="private" ViewboxUnits="Absolute" Viewbox="0,0, 30,30" ImageSource="/TestControl;component/Icons/spriteLight.png"/>
</Rectangle.Fill>
</Rectangle>
</Border>
我添加了以下方法:
private void UpdateLightStatus(Boolean statusOK)
{
int offset;
if (statusOK)
{
offset = 0;
}
else
{
offset = 30;
}
this.imgBrush.Viewbox = new Rect(offset, 0, 30, 30);
}
如果我使用它,那也行得通 "stand alone"。
但是,如果我尝试在我的 STATUSBOX 中实现它,我将无法使其正常工作... 我希望像这里 [I] 那样做一些事情,一切都完成了,但这不起作用。 在下一种方法中,我尝试在 LAMPCONTROL 中创建一个 DependencyProperty 与 STATUSBOX 中的 DependencyProperty 相同,并在 LAMPCONTROL 的 xaml 中添加一个绑定,从那时起我有点困惑。
问题 - 简而言之 - 是:如何调用子 UserControl 的方法 当 main-UserControl 的绑定 属性 更改时从 main-UserControl?
我希望我的问题有点容易理解,如果需要更多信息,我很乐意提供,但我不想让这个问题比现在更大...
感谢您阅读所有这些,并致以最诚挚的问候
法比安
克莱门斯让我走上了正确的方向。解决方法如下
How to call a method of a sub-UserControl from the main-UserControl when the bound property of the main-UserControl is changed?
您可以在主控件的 XAML 标记中给子控件一个 x:Name
:
<local:LampControl x:Name="subControl" />
然后您可以在主控件的代码隐藏中使用此名称访问它:
subControl.UpdateLightStatus(false);
克莱门斯让我走上了正确的方向。解决方法如下:
public static readonly DependencyProperty Value1Property =
DependencyProperty.Register("Value1", typeof(string),
typeof(UC_StatusBox_detailed), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender,
new PropertyChangedCallback(OnValueChanged)));
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//my code here
}