我有一个带有数据网格的WPF应用程序,用户将在其中输入文件名.我希望他们能够通过双击直接输入文件名,或者单击浏览按钮启动打开的文件对话框.
下面是XAML:
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Title="MainWindow" Height="450" Width="800">
<DataGrid Name="TheDataGrid"
ItemsSource="{Binding Inputs}"
AutoGenerateColumns="False"
CanUserAddRows="True">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Filename" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<DockPanel>
<Button DockPanel.Dock="Right" Content="Browse" Click="BrowseButton_Click" />
<TextBlock Text="{Binding Filename}" />
</DockPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<DockPanel>
<Button DockPanel.Dock="Right" Content="Browse" Click="BrowseButton_Click" />
<TextBox Text="{Binding Filename}" />
</DockPanel>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Window>
代码是这样的:
public partial class MainWindow : Window
{
public ObservableCollection<Input> Inputs { get; set; } = new ObservableCollection<Input>();
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
if (!ofd.ShowDialog().Value)
return;
if (((Button)sender).DataContext is Input i)
i.Filename = ofd.FileName;
else
{
// what to do here?
}
}
}
public class Input : INotifyPropertyChanged
{
private string filename;
public string Filename
{
get { return filename; }
set
{
filename = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Filename"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
我的问题是:
- 当用户在新行上单击Browse按钮时,
DataContext
不是类型Input
,而是DataGrid.NewItemPlaceholder
,所以我没有什么可以设置的文件名.我try 直接修改TextBlock
Text
,这很管用,但它不提交新行,即使在手动发出该命令时也是如此. - 当用户双击手动输入文件名时,它会进入编辑模式,但随后似乎需要再点击一次才能真正接受输入.有没有办法避免这种情况,让这种行为更像
DataGridTextColumn
分?