After first completely misunderstanding the question, here's my effort at getting my first bounty ;)
<Window.Resources>
<local:DivisionConverter x:Key="HoursConverter" Divisor="60"/>
<DataTemplate DataType="{x:Type local:MyObject}">
<StackPanel Orientation="Horizontal">
<TextBox x:Name="InputBox" Text="{Binding Path=Estimate}" Width="80"/>
<ComboBox x:Name="InputUnit" SelectedItem="Minutes">
<System:String>Minutes</System:String>
<System:String>Hours</System:String>
</ComboBox>
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding ElementName=InputUnit, Path=SelectedItem}" Value="Hours">
<Setter TargetName="InputBox" Property="Text" Value="{Binding Path=Estimate, Converter={StaticResource HoursConverter}}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Window.Resources>
<Grid>
<ContentControl VerticalAlignment="Top">
<local:MyObject Estimate="120"/>
</ContentControl>
</Grid>
In general i dislike specialized converters: after a while you lose track of which converter does what exactly, and you end up going through converter code everytime you think you need one, or worse you build a second one which does exactly the same. So now i'm only using them when all else fails.
Instead i defined a general purpose DivisionConverter, which divides the value in the Convert method, and multiplies the value in the ConvertBack method, exactly as you'd expect, no need to look at the code here ;)
Additionaly i use a DataTemplate and Triggers where others used a MultiBinding or (imo worse) added this UI logic in the getter and setter. This keeps all this relatively simple UI logic in one overseeable place.
Now just to be complete this is the code-behind:
public class MyObject
{
public double Estimate { get; set; }
}
public class DivisionConverter : IValueConverter
{
public double Divisor { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
double doubleValue = (double)value;
return doubleValue / Divisor;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
double inputValue;
if (!double.TryParse((string)value, NumberStyles.Any, culture, out inputValue))
return 0;
return inputValue * Divisor;
}
}