与WPF进行数据绑定

时间:2010-02-20 23:45:55

标签: c# wpf data-binding

我想将按钮的宽度绑定到某个文本框的文本值,尽管我希望按钮的宽度始终是文本框上写入的两倍。这是:

textBox1.Text = 10

将设置

button1.Width = 20

我是否只能通过ValueConverters执行此操作,还是有其他方法可以执行此操作?

由于

2 个答案:

答案 0 :(得分:2)

使用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,但至少你没有使用它来修改值。

答案 1 :(得分:1)

不是简单赋值的绑定,即转换器的用途。 (别无他法。)