将Combobox绑定到文件的值

时间:2016-02-24 17:50:34

标签: c# wpf

我有一个组合框,我在其中键入我的数据库服务器名称。我只想让它记住我到目前为止输入的内容,以便下次将其添加到其中的项目列表中,这样每次运行应用程序时我都不必再次键入相同的数据库服务器名称。 至于保存我在combox中输入的名字,我可以将它们保存在文件中,如文本文件,Json,XML等等。

我不知道怎么做绑定?什么时候加载文件?你能帮我举个例子吗?

<ComboBox x:Name="serverTxt" Height="23"  VerticalAlignment="Top" Text="{Binding Path=ServerNames}"/>

1 个答案:

答案 0 :(得分:2)

这是came from this answer的一些代码,稍加更新并添加了存储/检索。它应该至少让你开始。请注意,此解决方案需要窗口上的第二个元素(我在这里添加了第二个组合框),因为它在LostFocus上触发,否则它会在您键入时为每个字符更新。

像这样设置你的xaml:

<ComboBox x:Name="comboBox" HorizontalAlignment="Left" Margin="149,43,0,0" VerticalAlignment="Top" Width="120" IsEditable="True"
          ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" Text="{Binding NewItem, UpdateSourceTrigger=LostFocus}"/>
<ComboBox x:Name="comboBox1" HorizontalAlignment="Left" Margin="349,122,0,0" VerticalAlignment="Top" Width="120"/>

然后是您的主窗口:

public partial class MainWindow : Window
{
    private string _selectedItem;

    private ObservableCollection<string> ServerNames;
    private string fileLocation = @"C:\Temp\ServerNames.txt";

    public MainWindow()
    {
       ServerNames = new ObservableCollection<string>();

        if (File.Exists(fileLocation))
        {
            var list = File.ReadAllLines(fileLocation).ToList();
            list.ForEach(ServerNames.Add);
        }
        DataContext = this;
        InitializeComponent();
    }

    public IEnumerable Items => ServerNames;

    public string SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            _selectedItem = value;
            OnPropertyChanged("SelectedItem");
        }
    }

    public string NewItem
    {
        set
        {
            if (SelectedItem != null)
            {
                return;
            }
            if (!string.IsNullOrEmpty(value))
            {
                ServerNames.Add(value);
                SelectedItem = value;
            }
        }
    }

    protected void OnPropertyChanged(string propertyName)
    {
        var handler = this.PropertyChanged;
        handler?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void Window_Closing(object sender, CancelEventArgs e)
    {
        if (!File.Exists(fileLocation))
        {
            File.Create(fileLocation);
        }

        File.WriteAllLines(fileLocation, ServerNames);
    }
}