private void bind() {

    // Displays the file selector, and then saves the package description to the given file.
    view.getSaveButton()
        .setOnAction(
            arg0 -> {
              if (view.getArtifactDetailsWindow() != null
                  && view.getArtifactDetailsWindow().isShowing()) {
                view.getArtifactDetailsWindow().hide();
              }

              try {
                getController().savePackageStateFile();
              } catch (IOException | RDFTransformException e) {
                view.getErrorLabel().setText(TextFactory.getText(Errors.ErrorKey.IO_CREATE_ERROR));
              }
            });

    // Cancels the property popup, which closes the popup with out saving any changes.
    view.getCancelPopupHyperlink()
        .setOnAction(
            arg0 -> {
              if (view.getArtifactDetailsWindow() != null
                  && view.getArtifactDetailsWindow().isShowing()) {
                view.getArtifactDetailsWindow().hide();
              }
            });

    if (view.getArtifactDetailsWindow() != null) {
      view.getArtifactDetailsWindow().setOnCloseRequest(event -> saveCurrentNode());
    }

    // Saves any changes made in the package artifact property popup
    view.getApplyPopupButton()
        .setOnAction(
            arg0 -> {
              saveCurrentNode();
              if (view.getArtifactDetailsWindow() != null
                  && view.getArtifactDetailsWindow().isShowing()) {
                view.getArtifactDetailsWindow().hide();
              }
            });

    // Gets the button that's used to dismiss validation error popup.
    view.getReenableWarningsButton()
        .setOnAction(
            actionEvent ->
                preferences.putBoolean(
                    internalProperties.get(
                        InternalProperties.InternalPropertyKey.HIDE_PROPERTY_WARNING_PREFERENCE),
                    false));

    view.getRefreshPopupPositiveButton()
        .setOnAction(
            event -> {
              ipmService.mergeTree(controller.getPackageTree(), view.getRefreshResult());
              List<Node> currentlyIgnoredNodes = new ArrayList<>();
              getIgnoredNodes(view.getRoot().getValue(), currentlyIgnoredNodes);

              // To assign node types from the refresh we must unignore nodes so all nodes are
              // considered
              for (Node node : currentlyIgnoredNodes) {
                ipmService.ignoreNode(node, false);
              }

              controller
                  .getDomainProfileService()
                  .assignNodeTypes(
                      controller.getPrimaryDomainProfile(), controller.getPackageTree());

              // Once we're done assigning types we'll reignore whatever was previously ignored
              for (Node node : currentlyIgnoredNodes) {
                ipmService.ignoreNode(node, true);
              }

              displayPackageTree();
              view.getRefreshPopup().hide();
            });

    view.getRefreshPopupNegativeButton().setOnAction(event -> view.getRefreshPopup().hide());
  }