我有一个使用Framework = .NET 6.0
的WPF应用程序,我正在使用CommunityToolkit.Mvvm
来实现MVVM。我需要创建一个文本框,用户可以在其中拖放文件夹,在我的ViewModel
中,我需要获取此路径。我尝试使用MVVM
模式和一些xaml.cs
中的代码组合来实现此操作。但它并没有像预期的那样工作。
我的文本框XAML:
<TextBox Grid.Row="0" Grid.Column="1"
Name="TxtPath"
AllowDrop="True"
Drop="TxtPath_Drop"
PreviewDragOver="TxtPath_PreviewDragOver"
Text="{Binding PathText}">
</TextBox>
xaml.cs代码隐藏:
private void TxtPath_Drop(object sender, DragEventArgs e)
{
var files = (string[])e.Data.GetData(DataFormats.FileDrop);
if (files != null && files.Length != 0)
{
TxtPath.Text = files[0];
}
}
private void TxtPath_PreviewDragOver(object sender, DragEventArgs e)
{
e.Handled = true;
}
我得视图模型:
[ObservableProperty]
private string? pathText;
我希望每当拖放操作改变文本时,它都会更新我的PathText
,但事实并非如此。我得到了PathText
的null
值。我已经确认files[0]
有一个有效的路径值,并且我也可以在文本框中看到拖放的文件夹路径。
奇怪的是,我在代码中有第二个方法,用户可以单击[ Browse ]按钮,然后选择文件夹,对此我使用下面的方法,当完成此操作时,ViewModel中的PathText
将按预期更新。
private void BtnBrowse_Click(object sender, RoutedEventArgs e)
{
var folderBrowserDialog = new FolderBrowserDialog();
if (Directory.Exists(TxtPath.Text))
{
folderBrowserDialog.Reset();
folderBrowserDialog.SelectedPath = TxtPath.Text;
}
if (folderBrowserDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
TxtPath.Text = folderBrowserDialog.SelectedPath;
}
}
为什么button_Click
事件更新绑定,而textbox_Drop
事件不更新绑定?
编辑:排印错误
1条答案
按热度按时间yqlxgs2m1#
TextBox.Text
的UpdateSourceTrigger的默认值是LostFocus,因此当TextBox失去焦点时,绑定源将被更新。请参见How to: Control When the TextBox Text Updates the Source。解决方案是设置UpdateSourceTrigger PropertyChanged。
我不知道在第二种情况下会发生什么,但我猜这个序列以某种方式改变了应用程序中的焦点并触发了更新。