最初に質問を完全に誤解した後、これが私の最初の賞金を獲得するための私の努力です;)
<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>
一般的に、私は特殊なコンバーターが嫌いです。しばらくすると、どのコンバーターが正確に何を実行するかがわからなくなり、必要だと思うたびにコンバーターコードを実行することになります。さらに悪いことに、まったく同じことを実行する2番目のコンバーターを作成します。だから今、私は他のすべてが失敗したときにだけそれらを使用しています。
代わりに、私は汎用のDivisionConverterを定義しました。これは、Convertメソッドの値を分割し、ConvertBackメソッドの値を、期待どおりに乗算します。ここでコードを確認する必要はありません;)
さらに、他の人がMultiBindingを使用したり、(さらに悪いことに)このUIロジックをゲッターとセッターに追加したりする場合にDataTemplateとTriggersを使用します。これにより、この比較的単純なUIロジックがすべて1つの監視可能な場所に保持されます。
完全を期すために、これはコードビハインドです。
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;
}
}