【发布时间】:2011-01-19 05:45:30
【问题描述】:
我想将按钮的宽度绑定到某个文本框的文本值,尽管我希望按钮的宽度始终是文本框上所写宽度的两倍。这是:
textBox1.Text = 10
将设置
button1.Width = 20
我只能通过 ValueConverters 执行此操作还是有其他方法可以执行此操作?
谢谢
【问题讨论】:
标签: c# wpf data-binding
我想将按钮的宽度绑定到某个文本框的文本值,尽管我希望按钮的宽度始终是文本框上所写宽度的两倍。这是:
textBox1.Text = 10
将设置
button1.Width = 20
我只能通过 ValueConverters 执行此操作还是有其他方法可以执行此操作?
谢谢
【问题讨论】:
标签: c# wpf data-binding
使用 IValueConverter 是一种简单的解决方案,但如果您不想这样做,则可以尝试将 textbox1 和 button1 与单个变量绑定。例如,假设您创建了如下所示的两个控件,并绑定到一个名为 ButtonText 的变量中。为简单起见,按钮的 Content 将被修改,而不是按钮的 Width。
在 xaml 中:
<TextBox Text="{Binding ButtonText, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"/>
<Button Content="{Binding ButtonText, Mode=OneWay}"/>
在 ViewModel 中:
public string ButtonText
{
get { return _buttonText; }
set
{
int result;
if (int.TryParse(value, out result))
_buttonText = (result * 2).ToString();
else
_buttonText = value;
OnPropertyChanged("ButtonText");
}
}
private string _buttonText;
不幸的是,此解决方案在 .NET 4.0 中不起作用,因为 .NET 4.0 处理 OneWayToSource 的方式,如 article 中所述。基本上,问题是文本框将在由文本框设置后使用来自 ButtonText 的值进行更新,尽管其模式被配置为“OneWayToSource”。此解决方案适用于 .NET 3.5。
要解决 .NET 4.0 中的 OneWayToSource 问题,您可以使用 BlockingConverter(IValueConverter 的类型)来分隔每次使用资源并将 x:Shared="False", 设置为在此article 中说明。再说一次,您正在使用 IValueConverter,但至少您没有使用它来修改值。
【讨论】:
绑定不是简单的赋值,这就是值转换器的用途。 (没有其他办法。)
【讨论】: