两个自定义用户控件之间的绑定

本文关键字:控件 之间 绑定 用户 自定义 两个 | 更新日期: 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}"/>