我有控制权,是别人使用的。它有一个绑定到十进制值的TexBox。由于精度可以变化,我使用DependencyProperty和MultiBinding来指定它。 当TextBox没有聚焦时,数字应该以指定的精度显示,但是当它聚焦时,应该显示完整的数字。
示例:
我通过使用IMultibindingConverter和IsFocused属性完成了这项工作。但我不知道这是否是最佳方法。
我的TexBox定义如下
<UserControl.Resources>
<conv:ValuePrecisionConverter x:Key="ValuePrecisionConverter" />
</UserControl.Resources>
<TextBox x:Name="myTextBox">
<TextBox.Text>
<MultiBinding Converter="{StaticResource ValuePrecisionConverter}" Mode="TwoWay"
NotifyOnValidationError="true">
<Binding ElementName="parent" UpdateSourceTrigger="PropertyChanged" Path="Value" Mode="TwoWay" />
<Binding ElementName="parent" Path="Precision"/>
<Binding ElementName="parent" Path="AdditionalFormatting"/>
<Binding ElementName="myTextBox" Path="IsFocused" Mode="OneWay"/>
</MultiBinding>
</TextBox.Text>
</TextBox>
我的 ValuePrecisionConver 定义如下:
public class ValuePrecisionConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
double? value = null;
converter = null;
value = System.Convert.ToDouble(values[0]);
precision = System.Convert.ToInt32(values[1]);
//Other code with 3rd parameter
if (values.Count() > 3)
{
bool isFocused = System.Convert.ToBoolean(values[3]);
if (isFocused)
return value.ToString();
}
/*Here I do the formating with the given precision*/
return formattedValue;
}
}
这是完成我需要的最佳方式吗?可以像这样使用IsFocused属性吗?
答案 0 :(得分:0)
试试这个。
<TextBox x:Name="myTextBox">
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<Trigger Property="IsFocused" Value="False">
<Setter Property="Text" Value="{Binding Value, StringFormat=n2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Trigger>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Text" Value="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
答案 1 :(得分:0)
我希望您使用PreviewGotKeyboardFocus和PreviewLostKeyboardFocus进行事件触发...使用转换器设置值..此处不需要MuiltBinding ...