两个自定义用户控件之间的绑定
本文关键字:控件 之间 绑定 用户 自定义 两个 | 更新日期: 2023-09-27 18:05:18
我有两个需要相互交互的自定义NumberUpDown用户控件。左边这个的最大值必须是右边这个的最小值。为了实现这一点,我将它们放在另一个用户控件中,该控件包含这两个控件并具有所有所需的数据成员。
容器用户控件的xaml看起来像
<controls:NumberBox x:Name="LeftNumberBox" HorizontalAlignment="Right" Width="50" Min="{Binding Min}" Current="{Binding Left}" Max="{Binding Right}"/>
<controls:NumberBox x:Name="RightNumberBox" Grid.Column="2" HorizontalAlignment="Left" Width="50" Min="{Binding Left}" Current="{Binding Right}" Max="{Binding Max}"/>
和它的cs文件看起来像
public ThresholdBox()
{
InitializeComponent();
}
public int Min
{
get
{
return (int)GetValue(MinIntProperty);
}
set
{
SetValue(MinIntProperty, value);
}
}
public static readonly DependencyProperty MinIntProperty =
DependencyProperty.Register("Min", typeof(int), typeof(ThresholdBox), new PropertyMetadata(0));
public int Max
{
get
{
return (int)GetValue(MaxIntProperty);
}
set
{
SetValue(MaxIntProperty, value);
}
}
public static readonly DependencyProperty MaxIntProperty =
DependencyProperty.Register("Max", typeof(int), typeof(ThresholdBox), new PropertyMetadata(100));
public int Left
{
get
{
return LeftNumberBox.Current;
}
set
{
LeftNumberBox.Current = value;
}
}
public int Right
{
get
{
if(RightNumberBox != null)
{
return RightNumberBox.Current;
}
else
{
return 10;
}
}
set
{
RightNumberBox.Current = value;
}
}
和NumberBox又名NumberUpDown用户控制cs文件看起来像
public NumberBox()
{
InitializeComponent();
NUDTextBox.Text = Current.ToString();
Min = 0;
Current = 10;
Max = 100;
}
public int Min
{
get
{
return (int)GetValue(MinIntProperty);
}
set
{
SetValue(MinIntProperty, value);
}
}
public static readonly DependencyProperty MinIntProperty =
DependencyProperty.Register("Min", typeof(int), typeof(NumberBox), new PropertyMetadata(0));
public int Current
{
get
{
return (int)GetValue(CurrentIntProperty);
}
set
{
SetValue(CurrentIntProperty, value);
}
}
public static readonly DependencyProperty CurrentIntProperty =
DependencyProperty.Register("Current", typeof(int), typeof(NumberBox), new PropertyMetadata(10));
public int Max
{
get
{
return (int)GetValue(MaxIntProperty);
}
set
{
SetValue(MaxIntProperty, value);
}
}
public static readonly DependencyProperty MaxIntProperty =
DependencyProperty.Register("Max", typeof(int), typeof(NumberBox), new PropertyMetadata(100));
我没有包含按钮逻辑,因为它按预期工作
容器用
调用<controls:ThresholdBox Left="10" Right="90" Min="0" Max="100" Padding="0,20,0,20"/>
不幸的是,代码没有像预期的那样工作。两个NumberBoxes都从10开始,左边的将下降到0和上升到10,而右边的上升到100和不低于10,即使我在UI中将左边的NumberBoxes值降低到0。
我认为这可能是一个双向绑定问题,但导致StackOverFlow异常。我在我的绑定代码中缺少什么使两个NumberBoxes分别使用/修改容器的左和右属性?
如果"左边的最大值需要是右边的最小值",为什么这两个属性不能绑定到相同的值?给ViewModel添加一个新属性:
public int Intermediate { get; set; }
然后将左Max和右Min绑定到此属性。
<controls:NumberBox x:Name="LeftNumberBox" HorizontalAlignment="Right" Width="50" Min="{Binding Min}" Current="{Binding Left}" Max="{Binding Intermediate}"/>
<controls:NumberBox x:Name="RightNumberBox" Grid.Column="2" HorizontalAlignment="Left" Width="50" Min="{Binding Intermediate}" Current="{Binding Right}" Max="{Binding Max}"/>