Interpolation
Using if.bind , Aurelia signals will try to evaluate the expression. Therefore, you do not need to use interpolation syntax. You want to use interpolation only if you enter data into a property that is not controlled by Aurelia. A typical use case is to inject text into an arbitrary element.
<p>Welcome to my website, you are the ${visitorCount} visitor!</p>
You can also use interpolation in other places where you would arbitrarily want to enter data, including html attributes.
<input placeholder="${currentRecordType}" />
Interpolation is a one-way snap. More details here: http://aurelia.io/docs.html#string-interpolation
Bind
The binding syntax is now intended to snap to the behavior included in Aurelia. Out of the box, this includes some template logic, some attribute behavior, and some other custom stuff.
Each attribute is designed to verify where it is used and how it should be managed. For example, the following binding will be one-way, since it does not accept input and only one-way binding of variables makes sense.
<div if.bind="sectionEnabled"></div>
However, the next binding will be two-way, since it takes input and therefore will usually behave in two directions.
<input value.bind="firstName />
Note that there is no syntax to say "this is a variable." In fact, Aurelia suggests that you want to pass a variable. If you do not, for example, in the second case, you will not need Aurelia, and you simply write:
<input value="firstName" />
You can read more about binding syntax here: http://aurelia.io/docs.html#databinding
Answer
In your case, you are using the wrong approach, trying to relate the literal meaning. Aurelia looks for a variable called ${false} / false and most likely will not find it. You will want to create a variable in your viewModel to bind and indicate your binding to it:
ViewModel
class viewModel { ... constructor() { this.showTemplate = true; } }
view
<template> <div if.bind="showTemplate"> ... </div> </template>