【问题标题】:Databinding with WPF使用 WPF 进行数据绑定
【发布时间】:2011-01-19 05:45:30
【问题描述】:

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

textBox1.Text = 10

将设置

button1.Width = 20

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

谢谢

【问题讨论】:

    标签: c# wpf data-binding


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      绑定不是简单的赋值,这就是值转换器的用途。 (没有其他办法。)

      【讨论】:

        猜你喜欢
        • 2011-03-21
        • 2011-06-16
        • 1970-01-01
        • 2018-03-14
        • 1970-01-01
        • 2012-06-04
        • 2011-05-14
        • 1970-01-01
        相关资源
        最近更新 更多