我只是想将迁移我的一些旧应用程序从Win-forms迁移到WPF。在我以前的win-form应用程序中,我可以使用下面的代码将数组发送到ListBox
。
在我的新WPF应用中,这不会填充ListBox
。奇怪的是它没有错误,它只是不起作用。
......好吧,我第一次测试应用程序时出错了我收到一条消息说我没有权限,但现在它只是显示消息“完成”而没有做任何事情。
private void btnFolderBrowser_Click(object sender, RoutedEventArgs e)
{
getFileStructure();
System.Windows.Forms.MessageBox.Show("done!");
}
private void getFileStructure()
{
string myDir = "";
int i;
string filter = txtFilter.Text;
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.RootFolder = Environment.SpecialFolder.Desktop;
fbd.ShowNewFolderButton = false;
fbd.Description = "Browse to the root directory where the files are stored.";
if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
myDir = fbd.SelectedPath;
try
{
txtRootDir.Text = fbd.SelectedPath;
string[] fileName = Directory.GetFiles(myDir, filter, SearchOption.AllDirectories);
for (i = 0; i < fileName.Length; i++)
lstFileNames.Items.Add(fileName[i]);
}
catch (System.Exception excep)
{
System.Windows.Forms.MessageBox.Show(excep.Message);
return;
}
}
答案 0 :(得分:2)
在WPF中,您应该在后面的代码中填充属性并将UI元素绑定到这些属性,从背后的代码中引用/访问UIElements不是一个好的做法。
这是一个基于我认为你想要做的事情的模型示例。
的Xaml:
<Window x:Class="WpfApplication14.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Name="UI">
<StackPanel DataContext="{Binding ElementName=UI}">
<TextBox Text="{Binding TextRootDir}" IsReadOnly="True" />
<ListBox ItemsSource="{Binding MyFiles}" SelectedItem="{Binding SelectedFile}" Height="244" />
<TextBox Text="{Binding TextFilter, UpdateSourceTrigger=PropertyChanged}" />
<Button Content="Browse" Click="btnFolderBrowser_Click" >
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="IsEnabled" Value="True" />
<Style.Triggers>
<DataTrigger Binding="{Binding TextFilter}" Value="">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</StackPanel>
</Window>
代码:
public partial class MainWindow : Window, INotifyPropertyChanged
{
private string _textRootDir;
private string _textFilter = string.Empty;
private string _selectedFile;
private ObservableCollection<string> _myFiles = new ObservableCollection<string>();
public MainWindow()
{
InitializeComponent();
}
public ObservableCollection<string> MyFiles
{
get { return _myFiles; }
set { _myFiles = value; }
}
public string SelectedFile
{
get { return _selectedFile; }
set { _selectedFile = value; NotifyPropertyChanged("SelectedFile"); }
}
public string TextFilter
{
get { return _textFilter; }
set { _textFilter = value; NotifyPropertyChanged("TextFilter"); }
}
public string TextRootDir
{
get { return _textRootDir; }
set { _textRootDir = value; NotifyPropertyChanged("TextRootDir"); }
}
private void btnFolderBrowser_Click(object sender, RoutedEventArgs e)
{
GetFileStructure();
MessageBox.Show("done!");
}
private void GetFileStructure()
{
string myDir = "";
System.Windows.Forms.FolderBrowserDialog fbd = new System.Windows.Forms.FolderBrowserDialog();
fbd.RootFolder = Environment.SpecialFolder.Desktop;
fbd.ShowNewFolderButton = false;
fbd.Description = "Browse to the root directory where the files are stored.";
if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
myDir = fbd.SelectedPath;
try
{
TextRootDir = fbd.SelectedPath;
MyFiles.Clear();
foreach (var file in Directory.GetFiles(myDir, TextFilter, SearchOption.AllDirectories))
{
MyFiles.Add(file);
}
}
catch (Exception excep)
{
MessageBox.Show(excep.Message);
return;
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
结果: