我想要做的很簡單,當TextBox具有焦點時顯示一種格式,而當文本框沒有焦點時顯示另一種格式。在我的情況下,我將一個數字四捨五入爲3位數字,但不顯示焦點時顯示實際的整數,以便進行編輯。當使用MultiBinding聚焦時TextBox的不同格式不會更新源
我有一個相當簡單的解決方案,使用多重綁定,我覺得我幾乎在那裏。一切都按預期工作,在即時窗口中沒有錯誤,但綁定不會更新源。
我正在使用此樣式來傳遞我的綁定以及TextBox是否具有焦點到轉換器。
<Style x:Key="RoundedTextBox" TargetType="{x:Type ContentControl}">
<Setter Property="Focusable" Value="False"/>
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBox x:Name="TB" TextAlignment="Right" DataContext="{TemplateBinding Content}">
<TextBox.Text>
<MultiBinding Converter="{StaticResource DecRounder}" UpdateSourceTrigger="PropertyChanged">
<MultiBinding.Bindings>
<Binding ElementName="TB" Path="DataContext" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" BindsDirectlyToSource="True" />
<Binding ElementName="TB" Path="IsFocused" Mode="OneWay" />
</MultiBinding.Bindings>
</MultiBinding>
</TextBox.Text>
</TextBox>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
實例:
<ContentControl Style="{StaticResource RoundedTextBox}"
Content="{Binding Path=Model.SomeNumber}" />
和多值轉換器在這裏。
public class DecimalRoundingConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values.Length != 2)
throw new Exception("Invalid number of values for DecimalRoundingConverter!");
if (values[0] is string)
return values[0];
if (values[0] != null && !(values[0] is decimal))
throw new Exception("Invalid type for first value used with DecimalRoundingConverter!");
if (!(values[1] is bool))
throw new Exception("Invalid type for second value used with DecimalRoundingConverter!");
if (targetType != typeof(string))
throw new Exception("Invalid target type used with DecimalRoundingConverter!");
if (values[0] == null)
return null;
decimal number = (decimal)values[0];
bool isFocused;
if (values[1] == null)
isFocused = true;
else if (values[1] is bool)
isFocused = (bool)values[1];
else
if (!bool.TryParse((string)values[1], out isFocused))
throw new Exception("Invalid converter parameter used with DecimalRoundingConverter!");
return string.Format(isFocused ? "{0:.#############################}" : "{0:.###}", number);
}
public object[] ConvertBack(object value, Type[] targetType, object parameter, System.Globalization.CultureInfo culture)
{
decimal d;
var ret = new object[2];
if (value == null)
ret[0] = null;
else if (decimal.TryParse((string)value, out d))
ret[0] = d;
else
ret[0] = value;
ret[1] = Binding.DoNothing;
return ret;
}
}