考虑以下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
中输入值时,该值不会更新为目标。
答案 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" />
绑定不已清除。