Hallo zusammen,
ich hätte gerne die Maßeinheit (g, Kg etc.) direkt in (Beispielsweise : TextBox, NumericUpDown)
dem jeweiligen Control hinter dem Inhalt drin.
Das sobald etwas eingegeben wurde immer die entsprechend hintrelegte Einheit dahinter angezeigt wird.
Hat damit jemand Erfahrung oder eine Lösung parat?
Grüße
Woran soll anhand der Eingabe erkannt werden ob du 1.000 Gramm, Kilo oder Tonnen als Anwender eingeben willst?
Solche Maßeinheiten sind i.d.R. spezifisch auszuwählen.
Nachtrag:
In einer Textbox würde ich dies übrigens nicht einfügen.
Wenn du nur die numerischen Werte willst, musst du dann den Text wiederum um die Maßeinheit befreien.
Macht unnötig Mehraufwand auf deiner Seite.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
für nummerische Werte wäre natürlich ein anderes Control besser.
Das soll die Eingabe gar nicht erkennen ich will einfach nur hinter der Eingabe die Einheit stehen haben, die geb ich dem Control auch gerne mit, wenn es das dann kann.
Ich finde aktuell nichts.
Grüße
* Manche Controls besitzen ein EditTemplate und ein DisplayTemplate, die ausgetauscht werden wenn der Cursor drin ist (DataGridTextViewColumn?).
* eine zweite Möglichkeit wären vllt Trigger: zeige ein anderes Property an wenn das Control den Focus hat (z.B watermark): zeige die Einheit an wenn der Wert gerade nicht bearbeitet wird.
Hast du denn ein Beispiel für die Trigger?
An und für sich klingt das ja gut, klappt nur aktuell nicht so einfach.
<Trigger Property="IsFocused" Value="True">
<Setter Property="Text" Value="{Binding MaterialPreparationOfProtocols.Item.LastnameOfChildren, UpdateSourceTrigger=PropertyChanged}"/>
</Trigger>
<Trigger Property="IsFocused" Value="False">
<Setter Property="Text" Value="{Binding MaterialPreparationOfProtocols.Item.LastnameOfChildren, StringFormat={}{0}g, UpdateSourceTrigger=PropertyChanged}"/>
</Trigger>
Okay habs hinbekommen, die Idee mit dem Focus hatte ich auch schon, aber irgendwie hatte ich das nicht weiterverfolgt .. der Denkanstoß hat mir geholfen Danke!
Lösung :
Zusätzliche Klasse für das Focus Event
/// <summary>
/// Solution of this Class
/// https://stackoverflow.com/questions/1356045/set-focus-on-textbox-in-wpf-from-view-model-c
/// </summary>
public static class FocusBehavior
{
#region Dependency Properties
public static readonly DependencyProperty IsFocusedProperty =
DependencyProperty.RegisterAttached("IsFocused",
typeof(bool?),
typeof(FocusBehavior),
new FrameworkPropertyMetadata(IsFocusedChanged){ BindsTwoWayByDefault = true });
#endregion
#region Private Methods
private static void IsFocusedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var fe = (FrameworkElement)d;
if (e.OldValue == null)
{
fe.GotFocus += FrameworkElement_GotFocus;
fe.LostFocus += FrameworkElement_LostFocus;
}
if (!fe.IsVisible)
{
fe.IsVisibleChanged += new DependencyPropertyChangedEventHandler(fe_IsVisibleChanged);
}
if ((bool)e.NewValue)
{
fe.Focus();
}
}
private static void fe_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
var fe = (FrameworkElement)sender;
if (fe.IsVisible && (bool)((FrameworkElement)sender).GetValue(IsFocusedProperty))
{
fe.IsVisibleChanged -= fe_IsVisibleChanged;
fe.Focus();
}
}
private static void FrameworkElement_GotFocus(object sender, RoutedEventArgs e)
{
((FrameworkElement)sender).SetValue(IsFocusedProperty, true);
}
private static void FrameworkElement_LostFocus(object sender, RoutedEventArgs e)
{
((FrameworkElement)sender).SetValue(IsFocusedProperty, false);
}
#endregion
#region Public Methods
#region Get
public static bool? GetIsFocused(DependencyObject element)
{
if (element == null)
{
throw new ArgumentNullException("element");
}
return (bool?)element.GetValue(IsFocusedProperty);
}
#endregion
#region Set
public static void SetIsFocused(DependencyObject element, bool? value)
{
if (element == null)
{
throw new ArgumentNullException("element");
}
element.SetValue(IsFocusedProperty, value);
}
#endregion
#endregion
}
MVVM :
public string TextBoxMaterialPreparationProtcolsWeightText
{
get
{
if (TextBoxMaterialPreparartionProtocolsWeightIsFocused)
{
return Item.Weight.ToString();
} else { return Item.Weight + "g"; }
}
set
{
// Regex
Regex Regex = new Regex("^*[0-9]$");
if (Regex.IsMatch(value.ToString()))
{
Item.Weight = value != null ? Convert.ToInt32(value) : (int?)null;
}
else
{
if (String.IsNullOrEmpty(value)) { Item.TimeShift = null; }
}
Raise(nameof(TextBoxMaterialPreparationProtcolsWeightText));
}
}
public bool TextBoxMaterialPreparartionProtocolsWeightIsFocused
{
get { return _TextBoxMaterialPreparartionProtocolsWeightIsFocused; }
set
{
_TextBoxMaterialPreparartionProtocolsWeightIsFocused = value;
Raise(nameof(TextBoxMaterialPreparartionProtocolsWeightIsFocused));
Raise(nameof(TextBoxMaterialPreparationProtcolsWeightText));
}
}
XAML :
<TextBox Grid.Column="1"
HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
MaxLength="9"
mah:TextBoxHelper.ClearTextButton="False"
FocusBehavior:FocusBehavior.IsFocused="{Binding MaterialPreparationOfProtocols.TextBoxMaterialPreparartionProtocolsWeightIsFocused, UpdateSourceTrigger=PropertyChanged}"
Text="{Binding MaterialPreparationOfProtocols.TextBoxMaterialPreparationProtcolsWeightText, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource BaseTextBox}"/>
Grüße