OpenFileDialog с WPF в шаблоне M-V-VM - PullRequest
       21

OpenFileDialog с WPF в шаблоне M-V-VM

0 голосов
/ 18 августа 2011

Мне нужно использовать OpenFileDialog для выбора файла, но я не могу использовать какой-либо MVVM-ориентированный инструментарий, такой как Galgasoft, который позволяет мне делать это без нарушения шаблона MVVM.

Как еще можно этого добиться?

Ответы [ 2 ]

0 голосов
/ 24 июня 2016

Вы можете создать пользовательский элемент управления, так что вы можете просто привязать строку из него к свойству viewmodel.

Пользовательский элемент управления, который я обычно создаю, состоит из:

  • Текстовое поле или текстовое поле
  • Кнопка с изображением в качестве шаблона
  • Свойство зависимости строки, где путь к файлу будет перенесен в

Так что файл * .xaml будет выглядеть так

<Grid>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>

    <TextBox Grid.Column="0" Text="{Binding Text, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
    <Button Grid.Column="1"
            Click="Button_Click">
        <Button.Template>
            <ControlTemplate>
                <Image Grid.Column="1" Source="../Images/carpeta.png"/>
            </ControlTemplate>                
        </Button.Template>
    </Button>

</Grid>

И файл * .cs:

    public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
        "Text",
        typeof(string),
        typeof(customFilePicker),
        new FrameworkPropertyMetadata(
            null,
            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Journal));

    public string Text
    {
        get
        {
            return this.GetValue(TextProperty) as String;
        }
        set
        {
            this.SetValue(TextProperty, value);
        }
    }

    public FilePicker()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog openFileDialog = new OpenFileDialog();

        if(openFileDialog.ShowDialog() == true)
        {
            this.Text = openFileDialog.FileName;
        }
    }

В конце вы можете привязать его к вашей модели представления:

<controls:customFilePicker Text="{Binding Text}"}/>
0 голосов
/ 18 августа 2011

Конечно, вот пример кода, который я использую для чтения файлов Excel. Он входит в ViewModel и вызывается из SelectFileCommand

private void SelectFile()
{
    var dlg = new OpenFileDialog();
    dlg.DefaultExt = ".xls|.xlsx";
    dlg.Filter = "Excel documents (*.xls, *.xlsx)|*.xls;*.xlsx";

    if (dlg.ShowDialog() == true)
    {
        var file = new FileInfo(dlg.FileName);
        ReadExcelFile(file.FullName);
    }
}

private void ReadExcelFile(fileName)
{
    try
    {
        using (var conn = new OleDbConnection(string.Format(@"Provider=Microsoft.Ace.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0", fileName)))
        {
            OleDbDataAdapter da = new OleDbDataAdapter("SELECT DISTINCT [File Number] FROM [Sheet1$]", conn);
            var dt = new DataTable();
            da.Fill(dt);

            int i;
            FileContents = (from row in dt.AsEnumerable()
                            where int.TryParse(row[0].ToString(), out i)
                            select row[0]).ToList()
                            .ConvertAll<int>(p => int.Parse(p.ToString()));
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Unable to read contents:\n\n" + ex.Message, "Error");
    }
}

Вам необходимо указать Microsoft.Win32 для OpenFileDialog

...