Question

I am just trying to migrate some of my old apps from Win-forms to WPF. In my old win-form app I can send an array to a ListBox with the code below.

In my new WPF app, this will not populate the ListBox. What is weird is it does not error out, it just doesn't work.

...well it did error the very first time I tested the app I got a message that said I didn't have permissions, but now it just displays the message saying "done" without doing anything.

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;
    }
}
Was it helpful?

Solution

In WPF you should be populating Properties in the code behind and binding you UI elements to those properties, its not good practice to reference/access UIElements from the code behind.

Here is a mockup example based on what I think you are trying to do.

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>

Code:

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));
    }
}

Result:

enter image description here

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top