इस कोड (DefaultValueConverter.cs @ referencesource.microsoft.com से प्रेरित) एक दो तरह से किसी पाठ बॉक्स या इसी तरह के नियंत्रण के लिए बाध्य के लिए काम करता है, जब तक FormatString एक राज्य है कि वापस परिवर्तित किया जा सकता में स्रोत संपत्ति के toString() संस्करण को छोड़ देता है के रूप में। (यानी "#, 0.00" जैसे प्रारूप ठीक है क्योंकि "1,234.56" को वापस पार्स किया जा सकता है, लेकिन FormatString = "कुछ उपसर्ग टेक्स्ट #, 0.00" "कुछ उपसर्ग टेक्स्ट 1,234.56" में परिवर्तित हो जाएंगे जिन्हें वापस पार्स नहीं किया जा सकता है।)
XAML:
<TextBox>
<TextBox.Text>
<MultiBinding Converter="{StaticResource ToStringFormatConverter}"
ValidatesOnDataErrors="True" NotifyOnValidationError="True" TargetNullValue="">
<Binding Path="Property" TargetNullValue="" />
<Binding Path="PropertyStringFormat" Mode="OneWay" />
</MultiBinding>
</TextBox.Text>
</TextBox>
नोट TargetNullValue नकल करता है, तो स्रोत संपत्ति अशक्त हो सकता है।
सी #:
/// <summary>
/// Allow a binding where the StringFormat is also bound to a property (and can vary).
/// </summary>
public class ToStringFormatConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length == 1)
return System.Convert.ChangeType(values[0], targetType, culture);
if (values.Length >= 2 && values[0] is IFormattable)
return (values[0] as IFormattable).ToString((string)values[1], culture);
return null;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
var targetType = targetTypes[0];
var nullableUnderlyingType = Nullable.GetUnderlyingType(targetType);
if (nullableUnderlyingType != null) {
if (value == null)
return new[] { (object)null };
targetType = nullableUnderlyingType;
}
try {
object parsedValue = ToStringFormatConverter.TryParse(value, targetType, culture);
return parsedValue != DependencyProperty.UnsetValue
? new[] { parsedValue }
: new[] { System.Convert.ChangeType(value, targetType, culture) };
} catch {
return null;
}
}
// Some types have Parse methods that are more successful than their type converters at converting strings
private static object TryParse(object value, Type targetType, CultureInfo culture)
{
object result = DependencyProperty.UnsetValue;
string stringValue = value as string;
if (stringValue != null) {
try {
MethodInfo mi;
if (culture != null
&& (mi = targetType.GetMethod("Parse",
BindingFlags.Public | BindingFlags.Static, null,
new[] { typeof(string), typeof(NumberStyles), typeof(IFormatProvider) }, null))
!= null) {
result = mi.Invoke(null, new object[] { stringValue, NumberStyles.Any, culture });
}
else if (culture != null
&& (mi = targetType.GetMethod("Parse",
BindingFlags.Public | BindingFlags.Static, null,
new[] { typeof(string), typeof(IFormatProvider) }, null))
!= null) {
result = mi.Invoke(null, new object[] { stringValue, culture });
}
else if ((mi = targetType.GetMethod("Parse",
BindingFlags.Public | BindingFlags.Static, null,
new[] { typeof(string) }, null))
!= null) {
result = mi.Invoke(null, new object[] { stringValue });
}
} catch (TargetInvocationException) {
}
}
return result;
}
}
एक अच्छा सुझाव है कि। मुझे इसमें देखना होगा। मैं उम्मीद कर रहा था कि एक ऐसा समाधान होगा जिसमें कस्टम नियंत्रण शामिल न हों, लेकिन मैं निश्चित रूप से इसके लिए खुला हूं। मैं थोड़ी सी शोध के बाद वापस देखूंगा। –
मैं वही काम करने की कोशिश कर रहा हूं, लेकिन मुझे यकीन नहीं है कि इसे संभालने के लिए संलग्न गुणों को कैसे सेट अप करें। मैंने एक नया प्रश्न पोस्ट किया: http://stackoverflow.com/q/24119097/65461 –