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