【问题标题】:How can i reuse a single method instead of creating multiple copies我如何重用单个方法而不是创建多个副本
【发布时间】:2021-03-29 09:32:54
【问题描述】:

我有一个方法可以打开文件夹浏览器对话框,然后将字符串属性设置为配置应用程序设置。

因为我有多个可以在同一页面上配置的文件夹。我希望能够重用相同的方法。我应该注意什么?

我试过传入一个唯一的参数,但是方法需要调用 FirstFolder、SecondFolder 等属性来获取和设置值,如何在运行时在一个方法中更改这些目标属性?

ConfigurationView.xaml

<StackPanel Orientation="Horizontal">
    <TextBlock Text="First Folder : "/>
    <TextBox Text="{Binding FirstFolder}"/>
    <Button Content=". ." cal:Message.Attach="[Event Click] = [OpenFolderDialog]"/>
</StackPanel>

<StackPanel Orientation="Horizontal">
    <TextBlock Text="Second Folder : " />
    <TextBox Text="{Binding SecondFolder}" />
    <Button Content=". ." cal:Message.Attach="[Event Click] = [OpenFolderDialog]"/>
</StackPanel>

ConfigurationViewModel.cs

public class ConfigLocationsViewModel : Screen
{
    private readonly IConfiguration _config;
    private readonly IDialogService _dialogService;

    private firstFolder, secondFolder;

    public string FirstFolder
    {
        get { return firstFolder; }
        set { firstFolder= value; NotifyOfPropertyChange(() => FirstFolder); }
    }

    public string SecondFolder
    {
        get { return secondFolder; }
        set { secondFolder= value; NotifyOfPropertyChange(() => SecondFolder); }
    }

    public ConfigLocationsViewModel(IConfiguration config, IDialogService dialogService)
    {
        _config = config;
        _dialogService = dialogService;

        FirstFolder = _config.GetValue<string>("FolderLocations:FirstFolder");
        SecondFolder= _config.GetValue<string>("FolderLocations:SecondFolder");
    }

    public void SaveFirstFolder() => SaveSettings.AddOrUpdateAppSetting("FolderLocations:FirstFolder", FirstFolder);
    public void SaveSecondFolder() => SaveSettings.AddOrUpdateAppSetting("FolderLocations:SecondFolder", SecondFolder);

    // How to reuse this for Multiple Folders not just "FirstFolder"
    public void OpenFirstFolderDialog()
    {
        var settings = new FolderBrowserDialogSettings
        {
            Description = "Select First folder.",
            SelectedPath = IOPath.GetDirectoryName(FirstFolder ?? Assembly.GetExecutingAssembly().Location)
        };

        bool? success = _dialogService.ShowFolderBrowserDialog(this, settings);
        if (success == true)
        {
            FirstFolder = settings.SelectedPath + @"\";
            SaveFirstFolder();
        }
    }

    public void OpenSecondFolderDialog()
    {
        var settings = new FolderBrowserDialogSettings
        {
            Description = "Select Second folder.",
            SelectedPath = IOPath.GetDirectoryName(SecondFolder ?? Assembly.GetExecutingAssembly().Location)
        };

        bool? success = _dialogService.ShowFolderBrowserDialog(this, settings);
        if (success == true)
        {
            SecondFolder = settings.SelectedPath + @"\";
            SaveSecondtFolder();
        }
    }
}

【问题讨论】:

    标签: c# wpf xaml mvvm


    【解决方案1】:

    好吧,我想不出一个“聪明”的方法来做到这一点,所以我使用了一个简单的 switch 语句,传入一个识别参数。

    public void OpenFolderDialog(string folder)
    {
        var settings = new FolderBrowserDialogSettings
        {
            Description = $"Select {folder} folder.",
            SelectedPath = IOPath.GetDirectoryName(folder ?? Assembly.GetExecutingAssembly().Location)
        };
    
        bool? success = _dialogService.ShowFolderBrowserDialog(this, settings);
        if (success == true)
        {
            switch(binding)
            {
                case "FirstFolder":
                    FirstFolder = settings.SelectedPath + @"\";
                    SaveFirstFolder();
                    break;
                case "SecondFolder":
                    SecondFolder= settings.SelectedPath + @"\";
                    SaveSecondFolder();
                    break;
                 etc..
                 etc..
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      使用命令绑定:

      <Button Command="{Binding OpenFolderCommand}" CommandParameter="{Binding FirstFolder}"/>
      
      <Button Command="{Binding OpenFolderCommand}" CommandParameter="{Binding SecondFolder}"/>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-08
        • 1970-01-01
        • 2012-11-25
        • 2021-08-28
        • 2011-07-18
        • 1970-01-01
        相关资源
        最近更新 更多