按钮单击后绑定中断

时间:2018-03-01 13:18:36

标签: wpf xaml

考虑以下xaml代码。

<TextBox x:Name="txtbox1" Grid.Row="1" Background="Aqua" Height="33" Width="55" Text="45"/>
<Button Content="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Height}"
        Click="bttn_Click"   x:Name="bttn" 
        Height="{Binding ElementName=txtbox1, Path=Text, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"
        Grid.Row="2" />

bttn_Click如下,

private void bttn_Click(object sender, RoutedEventArgs e)
{
    double randomNo = 10;
    Random random = new Random();
    randomNo = random.Next(45,85);
    this.bttn.Height = randomNo;
}

点击Button后,目标中的值已更新。但在此之后,当我在TextBox中输入值时,该值不会更新为目标。

3 个答案:

答案 0 :(得分:2)

高度是依赖属性。由于其值可能在多个位置“设置”,因此有一个precendence list

直接设置其值(本地值)具有绑定优先级。 在我提供的链接中明确说明:

  

对本地值的任何更改都将替换动态资源或绑定   完全

答案 1 :(得分:0)

您的bttn_Click活动会更新Button高度,但不会更新为Textbox中输入的高度,如您的约束所示。

为了保留这两个操作,我建议您将Button高度属性绑定到Text的{​​{1}}值,就像您已经完成的那样,但是使用Converter将字符串解析为int /双

<强>转换器

Textbox

然后将public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var text = (string)value; return Int32.Parse(text); } 高度改为:

Button

注意:只有在验证文本时才会更新高度,具体取决于您的配置方式。

答案 2 :(得分:0)

以编程方式设置Height属性有效地清除了您在XAML标记中定义的绑定。

您应该通过设置绑定的source属性来更改高度,即Text的{​​{1}}属性:

TextBox

另一种选择是将private void bttn_Click(object sender, RoutedEventArgs e) { double randomNo = 10; Random random = new Random(); randomNo = random.Next(45, 85); this.txtbox1.Text = randomNo.ToString(); } 的{​​{1}}设置为Mode

Binding

这是有效的,因为当您以编程方式设置属性时,TwoWay绑定,unline <Button Content="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Height}" Click="bttn_Click" x:Name="bttn" Height="{Binding ElementName=txtbox1, Path=Text, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Grid.Row="2" /> 绑定已清除。