gpt4 book ai didi

c# - 在 WPF 中,如何绑定(bind) LostFocus 但验证 PropertyChanged?

转载 作者:行者123 更新时间:2023-12-04 15:10:25 24 4
gpt4 key购买 nike

我希望能够绑定(bind)一个 TextBox 并将 UpdateSourceTrigger 设置为 LostFocus(默认设置),但在用户键入文本时执行验证。我能想到的最好办法是处理 TextChanged 事件并在 View 模型上调用验证方法。我想知道是否有更好的解决方案。

我的 View 模型监听模型中的属性更改以更新自身(包括格式化)。我不想将 UpdateSourceTrigger 设置为 PropertyChanged 进行绑定(bind),因为这会导致在用户键入时立即格式化文本(例如,用户可能希望在他/她键入“1”时立即键入“1.2” “由于 View 模型的自动格式化,文本更改为“1.0”。

最佳答案

详细说明我留下的评论,这是一个如何完成的示例。

仅供引用,我将 nuget 包 MvvmLight 用于管道。

MainWindow.xaml

<StackPanel>
<TextBox x:Name="myTextBox" Text="{Binding SomeNumberViewModel.IntermediateText, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" Width="100" Margin="5"/>
<Button Content="Hi" HorizontalAlignment="Center" Padding="5,15" Margin="5"/>
</StackPanel>

MainWindow.xaml.cs

public MainViewModel ViewModel
{
get
{
return this.DataContext as MainViewModel;
}
}
public MainWindow()
{
InitializeComponent();
this.myTextBox.LostFocus += MyTextBox_LostFocus;
}

private void MyTextBox_LostFocus(object sender, RoutedEventArgs e)
{
// If the IntermediateText has no validation errors, then update your model.
if (string.IsNullOrEmpty(this.ViewModel.SomeNumberViewModel[nameof(this.ViewModel.SomeNumberViewModel.IntermediateText)]))
{
// Update your model and it gets formatted result
this.ViewModel.SomeNumberViewModel.ModelValue = this.ViewModel.SomeNumberViewModel.IntermediateText;

// Then, update your IntermediateText to update the UI.
this.ViewModel.SomeNumberViewModel.IntermediateText = this.ViewModel.SomeNumberViewModel.ModelValue;
}
}

MainViewModel.cs

public class MainViewModel : ViewModelBase
{
private SomeNumberViewModel someNumberViewModel;

public string MyTitle { get => "Stack Overflow Question 65279367"; }

public SomeNumberViewModel SomeNumberViewModel
{
get
{
if (this.someNumberViewModel == null)
this.someNumberViewModel = new SomeNumberViewModel(new MyModel());
return this.someNumberViewModel;
}
}
}

SomeNumberViewModel.cs

public class SomeNumberViewModel : ViewModelBase, IDataErrorInfo
{
public SomeNumberViewModel(MyModel model)
{
this.Model = model;
}

private string intermediateText;
public string IntermediateText { get => this.intermediateText; set { this.intermediateText = value; RaisePropertyChanged(); } }
public string ModelValue
{
get => this.Model.SomeNumber.ToString("0.00");

set
{
try
{
this.Model.SomeNumber = Convert.ToDouble(value);
RaisePropertyChanged();
}
catch
{
}
}
}

public MyModel Model { get; private set; }

public string Error { get => null; }

public string this[string columnName]
{
get
{
switch (columnName)
{
case "IntermediateText":
if (!string.IsNullOrEmpty(this.IntermediateText) && FormatErrors(this.IntermediateText))
return "Format errors";
break;
}

return string.Empty;
}
}

/// <summary>
/// Only allow numbers to be \d+, or \d+\.\d+
/// For Example: 1, 1.0, 11.23, etc.
/// Anything else is a format violation.
/// </summary>
/// <param name="numberText"></param>
/// <returns></returns>
private bool FormatErrors(string numberText)
{
var valid = (Regex.IsMatch(numberText, @"^(\d+|\d+\.\d+)$"));
return !valid;
}
}

MyModel.cs

public class MyModel
{
public double SomeNumber { get; set; }
}

关于c# - 在 WPF 中,如何绑定(bind) LostFocus 但验证 PropertyChanged?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65279367/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com