当前位置: 首页 > 知识库问答 >
问题:

WPF文本框绑定不使用拖放更新

黄浩涆
2023-03-14
XAML:
<Window.DataContext>
    <local:XmlFile x:Name="XmlFileInfo"/>
</Window.DataContext>
...
<StackPanel Orientation="Horizontal" Grid.Row="0">
        <Label Content="XML File:"/>
        <TextBox x:Name="xmlFilePath" Text="{Binding XMLFile}" Height="25" VerticalAlignment="Top" MinWidth="300" AllowDrop="True" PreviewDragOver="xmlFilePath_PreviewDragOver" Drop="xmlFilePath_Drop"/>
</StackPanel>
public class XmlFile
{
    private string _xmlfile;
    private string _xmlElementName;
    public string XMLFile
    {
        get { return _xmlfile; }
        set
        {
            if (value != _xmlfile)
            {
                _xmlfile = value;
                _xmlElementName = SetElementNameFromFileName();
            }
        }
    }
...
}

最后是我的XAML代码

    public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Exit_Click(object sender, RoutedEventArgs e)
    {
        Application.Current.Shutdown();
    }

    private void SetControlState()
    {
        FileTest.IsEnabled = false;
        if (!string.IsNullOrEmpty(XmlFileInfo.XMLFile))
        {
            if(XmlFileInfo.IsValidXml(XmlFileInfo.XMLFile))
            {
                FileTest.IsEnabled = true;
            }
        }
    }

    private void xmlFilePath_PreviewDragOver(object sender, DragEventArgs e)
    {
        e.Handled = true;
    }

    private void xmlFilePath_Drop(object sender, DragEventArgs e)
    {
        var filenames = (string[])e.Data.GetData(DataFormats.FileDrop);
        if (filenames == null) return;
        var filename = filenames.FirstOrDefault();
        if (filename == null) return;
        //XmlFileInfo.XMLFile = filename; <-- This bypasses the binding
        (sender as TextBox).Text = filename; // This should trigger updating binding
        SetControlState(); //<-- enables a button control if file is valid
    }
}

我已经尝试将绑定模式设置为twoway和其他绑定设置,但行为没有任何变化。我想做的是弄清楚如何让drop功能像手动键入框并离开框一样工作,而不必绕过绑定并直接设置属性。

共有1个答案

蒋无尘
2023-03-14

使ViewModel实现InotifyPropertyChanged。与其直接更改文本框的文本,不如更改ViewModel中的文件名。那就行了。

您还必须在XMLFile-Property的setter中调用OnPropertyChanged

public class XmlFile : INotifyPropertyChanged
{
    private string _xmlfile;
    private string _xmlElementName;
    public string XMLFile
    {
        get { return _xmlfile; }
        set
        {
            if (value != _xmlfile)
            {
                _xmlfile = value;
                _xmlElementName = SetElementNameFromFileName();
                OnPropertyChanged(nameof(XMLFile); //this tells your UI to update
            }
        }
    }
...
}


 private void xmlFilePath_Drop(object sender, DragEventArgs e)
    {
        var filenames = (string[])e.Data.GetData(DataFormats.FileDrop);
        if (filenames == null) return;
        var filename = filenames.FirstOrDefault();
        if (filename == null) return;
        //XmlFileInfo.XMLFile = filename; <-- This bypasses the binding
        var viewModel = (XmlFile)this.DataContext;
        viewModel.XMLFile = filename;
        SetControlState(); //<-- enables a button control if file is valid
    }

您应该看看数据绑定是如何工作的。

 类似资料:
  • 我有一个约束性问题,在过去的两天里我一直无法解决。我已经彻底地浏览了关于SO的大部分相关线程,但仍然无法确定错误所在。 我遇到的问题是程序中的一个文本框。其目的是显示用户从文件浏览器中选择的文件。我已经将它的text属性绑定到一个名为的字符串,但文本框从未更新,即使调试似乎显示iNotifyPropertyChanged被正确调用和执行。 如果我的代码有错误,请帮我看看下面我的代码。 文本框是名为

  • 使用Datagridtemplatecolumn将WPFDatagrid绑定到组合框。很难获得组合框绑定的selectedItem。我发现了类似的例子,但这并不能解决我的问题。 请在下面找到我的 XAML 的代码片段和数据结构: 我在上面定义了一个数据结构,它实现了INotifyPropertychanged接口。 现在,在视图模型中,有一个可观察的X列表集合,即XList,它绑定到XAML中的数

  • 如何在拖动时更改可拖动元素的文本,我有来自cdk/拖放库的代码片段。它为在拖动时捕捉事件提供参数。我可以通过本机元素进行更改,但它会更改所有样式,而且我还需要在dragover或其他操作上设置另一个事件。如果要在拖动元素上放置随机文本,有哪些选项? 在Html 在TS

  • 我使用的是WPF ListView,其中SelectionMode设置为Extended(只能按ctrl键选择多个项目)。我需要实施D 不幸的是,这样的解决方案有一个错误:选择单个项目(未按 ctrl)有效。但是,我需要双击以选择项目,同时按ctrl才能选择多个项目。使用 ListView 的 PreviewMouseDown 或 ListViewItem 的 PreviewMouseDown 时

  • 我是C#新手,我不断收到以下无法删除的错误。 我的代码如下,我不能确切地说出哪一行导致了错误,但我怀疑它与RibbonRadioButtons有关,因为如果我删除它们,我不会得到错误。只有在单击两个或更多单选按钮后,错误才会出现。ComboBoxItem上的一个回答继续抛出绑定错误,尽管style暗示是多个Refresh()语句导致了这个问题,但我不知道如何避免这个问题。 有人能帮我解决这个问题吗

  • 我有一个用户控件,其数据上下文设置为名为 EmployeeList_VM 的视图模型。然后,我在该用户控件中有一个 ContentControl,该控件将其 datacontect 设置为视图模型的公共属性 (EmployeeSelection)。ContentControl 的数据上下文与同一用户控件中列表框的选定项绑定相同。 我希望ContentControl中的combobox(属于名为Em