wpf Textbox_Drop事件不会更新ViewModel中的属性

ctrmrzij  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(132)

我有一个使用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,但事实并非如此。我得到了PathTextnull值。我已经确认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事件不更新绑定?
编辑:排印错误

yqlxgs2m

yqlxgs2m1#

TextBox.Text的UpdateSourceTrigger的默认值是LostFocus,因此当TextBox失去焦点时,绑定源将被更新。请参见How to: Control When the TextBox Text Updates the Source
解决方案是设置UpdateSourceTrigger PropertyChanged。

Text="{Binding PathText, UpdateSourceTrigger=PropertyChanged}"

我不知道在第二种情况下会发生什么,但我猜这个序列以某种方式改变了应用程序中的焦点并触发了更新。

相关问题