我可以绑定到实用程序 class 吗?
Can I bind to a utility class?
我有一个通用的 class 填充了通用函数,如下面的函数来解析文本框:
public static void DoubleParse_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Decimal)
{
var textBox = sender as TextBox;
if (textBox != null)
textBox.Text += Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator);
}
else
{
e.Handled = (e.Key >= Key.D0 && e.Key <= Key.D9) ||
(e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) ||
e.Key == Key.Back || e.Key == Key.Delete ||
e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Unknown;
}
}
我想我可以在我的页面的任何地方使用它作为 TextBox 按键事件的单一来源。 WP8 中 MVVM 实现的新手,好奇是否有实现此目的的方法?
本着 MVVM 的精神(虽然我不是纯粹主义者),我明白它不需要特别在视图模型中,但我仍然喜欢它集中。
快速说明:
- class 不是静态的,我知道我不能直接在 xaml 中使用它。
- 我想使 class 成为某种 StaticResource 并引用 xaml 中的函数。但这似乎行不通。
- 我目前只是在代码隐藏中使用传递函数并将发送者传递给静态函数。
你想要一个附加行为。
public static class TextBoxBehavior
{
public static bool GetAllowOnlyDecimalInput(TextBox texbox)
{
return (bool)texbox.GetValue(AllowOnlyDecimalInputProperty);
}
public static void SetAllowOnlyDecimalInput(
TextBox texbox, bool value)
{
texbox.SetValue(AllowOnlyDecimalInputProperty, value);
}
public static readonly DependencyProperty AllowOnlyDecimalInputProperty =
DependencyProperty.RegisterAttached(
"AllowOnlyDecimalInput",
typeof(bool),
typeof(TextBox),
new PropertyMetadata(false, OnAllowOnlyDecimalInputChanged));
static void OnAllowOnlyDecimalInputChanged(
DependencyObject depObj, DependencyPropertyChangedEventArgs e)
{
TextBox item = depObj as TextBox;
if (item == null)
return;
if (e.NewValue is bool == false)
return;
if ((bool)e.NewValue)
item.KeyDown += OnTextBoxDoubleParse_KeyDown;
else
item.KeyDown -= OnTextBoxDoubleParse_KeyDown;
}
static void OnTextBoxDoubleParse_KeyDown(object sender, KeyEventArgs e)
{
if (!Object.ReferenceEquals(sender, e.OriginalSource))
return;
TextBox item = e.OriginalSource as TextBox;
if (item != null) {
if (e.Key == Key.Decimal)
{
var textBox = sender as TextBox;
if (textBox != null)
textBox.Text += Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator);
}
else
{
e.Handled = (e.Key >= Key.D0 && e.Key <= Key.D9) ||
(e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) ||
e.Key == Key.Back || e.Key == Key.Delete ||
e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Unknown;
}
}
}
#endregion // AllowOnlyDecimalInput
}
在 XAML 中与
一起使用
<TextBox my:TextBoxBehavior.AllowOnlyDecimalInput="True" />
您还可以在 WPF 样式中设置它并使其在所有或许多控件中重复使用,而不是每次都手动添加 属性。
我有一个通用的 class 填充了通用函数,如下面的函数来解析文本框:
public static void DoubleParse_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Decimal)
{
var textBox = sender as TextBox;
if (textBox != null)
textBox.Text += Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator);
}
else
{
e.Handled = (e.Key >= Key.D0 && e.Key <= Key.D9) ||
(e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) ||
e.Key == Key.Back || e.Key == Key.Delete ||
e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Unknown;
}
}
我想我可以在我的页面的任何地方使用它作为 TextBox 按键事件的单一来源。 WP8 中 MVVM 实现的新手,好奇是否有实现此目的的方法?
本着 MVVM 的精神(虽然我不是纯粹主义者),我明白它不需要特别在视图模型中,但我仍然喜欢它集中。
快速说明:
- class 不是静态的,我知道我不能直接在 xaml 中使用它。
- 我想使 class 成为某种 StaticResource 并引用 xaml 中的函数。但这似乎行不通。
- 我目前只是在代码隐藏中使用传递函数并将发送者传递给静态函数。
你想要一个附加行为。
public static class TextBoxBehavior
{
public static bool GetAllowOnlyDecimalInput(TextBox texbox)
{
return (bool)texbox.GetValue(AllowOnlyDecimalInputProperty);
}
public static void SetAllowOnlyDecimalInput(
TextBox texbox, bool value)
{
texbox.SetValue(AllowOnlyDecimalInputProperty, value);
}
public static readonly DependencyProperty AllowOnlyDecimalInputProperty =
DependencyProperty.RegisterAttached(
"AllowOnlyDecimalInput",
typeof(bool),
typeof(TextBox),
new PropertyMetadata(false, OnAllowOnlyDecimalInputChanged));
static void OnAllowOnlyDecimalInputChanged(
DependencyObject depObj, DependencyPropertyChangedEventArgs e)
{
TextBox item = depObj as TextBox;
if (item == null)
return;
if (e.NewValue is bool == false)
return;
if ((bool)e.NewValue)
item.KeyDown += OnTextBoxDoubleParse_KeyDown;
else
item.KeyDown -= OnTextBoxDoubleParse_KeyDown;
}
static void OnTextBoxDoubleParse_KeyDown(object sender, KeyEventArgs e)
{
if (!Object.ReferenceEquals(sender, e.OriginalSource))
return;
TextBox item = e.OriginalSource as TextBox;
if (item != null) {
if (e.Key == Key.Decimal)
{
var textBox = sender as TextBox;
if (textBox != null)
textBox.Text += Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator);
}
else
{
e.Handled = (e.Key >= Key.D0 && e.Key <= Key.D9) ||
(e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) ||
e.Key == Key.Back || e.Key == Key.Delete ||
e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Unknown;
}
}
}
#endregion // AllowOnlyDecimalInput
}
在 XAML 中与
一起使用<TextBox my:TextBoxBehavior.AllowOnlyDecimalInput="True" />
您还可以在 WPF 样式中设置它并使其在所有或许多控件中重复使用,而不是每次都手动添加 属性。