Использование IValueConverter - простое решение, но если вы не хотите этого делать, вы можете попробовать связать textbox1 и button1 с одной переменной. Например, допустим, вы создали два элемента управления, как показано ниже, и связали их в одну переменную с именем ButtonText. Для простоты Содержимое кнопки будет изменено вместо Ширина кнопки.
В 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, как указано в этой статье . По сути, проблема в том, что текстовое поле будет обновлено значением ButtonText после того, как оно будет установлено текстовым полем, хотя его режим был настроен как «OneWayToSource». Это решение будет работать для .NET 3.5.
Чтобы обойти эту проблему OneWayToSource в .NET 4.0, вы можете использовать BlockingConverter (тип IValueConverter) для разделения каждый раз, когда ресурс используется, и установить x: Shared = "False", , как указано в этой статье . С другой стороны, вы используете IValueConverter, но, по крайней мере, не используете его для изменения значения.