diff --git a/djblets/static/djblets/js/configForms/views/listItemView.js b/djblets/static/djblets/js/configForms/views/listItemView.js
index 32313f156c19fa1df7cb10e12006139bcc04525e..376f1364abe39ef9b6e0dcca5dc4b557f7524ee1 100644
--- a/djblets/static/djblets/js/configForms/views/listItemView.js
+++ b/djblets/static/djblets/js/configForms/views/listItemView.js
@@ -185,12 +185,15 @@ Djblets.Config.ListItemView = Backbone.View.extend({
         var actionHandlerName = (action.enabled !== false
                                  ? this.actionHandlers[action.id]
                                  : null),
+            isCheckbox = (action.type === 'checkbox'),
+            isRadio = (action.type === 'radio'),
+            actionHandler,
             inputID,
             $action,
             $label,
             $result;
 
-        if (action.type === 'checkbox' || action.type === 'radio') {
+        if (isCheckbox || isRadio) {
             inputID = _.uniqueId('action_' + action.type);
             $action = $('<input/>')
                 .attr({
@@ -211,7 +214,15 @@ Djblets.Config.ListItemView = Backbone.View.extend({
                 .append($label);
 
             if (action.propName) {
-                $action.bindProperty('checked', this.model, action.propName);
+                if (isCheckbox) {
+                    $action.bindProperty('checked', this.model,
+                                         action.propName);
+                } else if (isRadio) {
+                    $action.bindProperty(
+                        'checked', this.model, action.propName, {
+                            radioValue: action.radioValue
+                        });
+                }
             }
 
             if (actionHandlerName) {
diff --git a/djblets/static/djblets/js/jquery.gravy.backboneUtils.js b/djblets/static/djblets/js/jquery.gravy.backboneUtils.js
index 88f55dbea6861567e0c2e4fb170d598e1ab24cd9..ff025018fccc8598614402d811c472319b2ad6c3 100644
--- a/djblets/static/djblets/js/jquery.gravy.backboneUtils.js
+++ b/djblets/static/djblets/js/jquery.gravy.backboneUtils.js
@@ -50,11 +50,22 @@ $.fn.bindClass = function(model, modelPropName, className, options) {
  * properties. This is useful when tying a "disabled" element property to
  * an "enabled" or "can*" model property. It only makes sense for boolean
  * properties.
+ *
+ * If options.radioValue is set, then the assumption is that a boolean
+ * property on the element (such as 'checked') maps to a non-boolean value
+ * in a model, of which many inputs will be bound. In this case, the element's
+ * property will be set to a boolean based on whether the model property's
+ * value matches option.radioValue. Likewise, the model property's value will
+ * be set to options.radioValue if the element's property value is true.
  */
 $.fn.bindProperty = function(elPropName, model, modelPropName, options) {
     function updateElementProp() {
         var value = model.get(modelPropName);
 
+        if (options.radioValue !== undefined) {
+            value = (options.radioValue === value);
+        }
+
         if (options.inverse) {
             value = !value;
         }
@@ -75,7 +86,8 @@ $.fn.bindProperty = function(elPropName, model, modelPropName, options) {
     options = _.defaults(options || {}, {
         modelToElement: true,
         elementToModel: true,
-        inverse: false
+        inverse: false,
+        radioValue: undefined
     });
 
     if (options.modelToElement) {
@@ -93,6 +105,14 @@ $.fn.bindProperty = function(elPropName, model, modelPropName, options) {
                 value = !value;
             }
 
+            if (options.radioValue !== undefined) {
+                if (value) {
+                    value = options.radioValue;
+                } else {
+                    return;
+                }
+            }
+
             model.set(modelPropName, value);
         });
     }
diff --git a/djblets/static/djblets/js/tests/backboneUtilsTests.js b/djblets/static/djblets/js/tests/backboneUtilsTests.js
index c1b5b12de711addc5afa0399efa4723c5ec0efd9..06ce0b3426daca74633d760d6c2d58692b6c1c7f 100644
--- a/djblets/static/djblets/js/tests/backboneUtilsTests.js
+++ b/djblets/static/djblets/js/tests/backboneUtilsTests.js
@@ -82,14 +82,22 @@ suite('djblets/gravy/backboneUtils', function() {
     });
 
     describe('$.fn.bindProperty', function() {
-        var $el;
+        var $el,
+            $radio1,
+            $radio2;
 
         beforeEach(function() {
             $el = $("<input type='checkbox'/>").appendTo(document.body);
+            $radio1 = $('<input type="radio" name="my-radio" value="one" />')
+                .appendTo(document.body);
+            $radio2 = $('<input type="radio" name="my-radio" value="two" />')
+                .appendTo(document.body);
         });
 
         afterEach(function() {
             $el.remove();
+            $radio1.remove();
+            $radio2.remove();
         });
 
         describe("Initial property values", function() {
@@ -99,7 +107,7 @@ suite('djblets/gravy/backboneUtils', function() {
                 expect($el.prop('checked')).toBe(true);
             });
 
-            it("Setting element's property form model property's with " +
+            it("Setting element's property from model property's with " +
                "inverse=true",
                function() {
                 model.set('mybool', false);
@@ -110,6 +118,22 @@ suite('djblets/gravy/backboneUtils', function() {
                 expect(model.get('mybool')).toBe(false);
             });
 
+            it("Setting element's property from model property with radioValue",
+               function() {
+                model.set('myvalue', 'one');
+
+                $radio1.bindProperty('checked', model, 'myvalue', {
+                    radioValue: 'one'
+                });
+                $radio2.bindProperty('checked', model, 'myvalue', {
+                    radioValue: 'two'
+                });
+
+                expect($radio1.prop('checked')).toBe(true);
+                expect($radio2.prop('checked')).toBe(false);
+                expect(model.get('myvalue')).toBe('one');
+            });
+
             it('No element changes with modelToElement=false', function() {
                 model.set('mybool', true);
                 $el.bindProperty('checked', model, 'mybool', {
@@ -142,6 +166,25 @@ suite('djblets/gravy/backboneUtils', function() {
                 expect(model.get('mybool')).toBe(true);
             });
 
+            it("Setting element's property with radioValue", function() {
+                model.set('myvalue', 'one');
+
+                $radio1.bindProperty('checked', model, 'myvalue', {
+                    radioValue: 'one'
+                });
+                $radio2.bindProperty('checked', model, 'myvalue', {
+                    radioValue: 'two'
+                });
+
+                expect($radio1.prop('checked')).toBe(true);
+                expect($radio2.prop('checked')).toBe(false);
+
+                model.set('myvalue', 'two');
+                expect($radio1.prop('checked')).toBe(false);
+                expect($radio2.prop('checked')).toBe(true);
+                expect(model.get('myvalue')).toBe('two');
+            });
+
             it('No element changes with modelToElement=false', function() {
                 model.set('mybool', false);
                 $el.bindProperty('checked', model, 'mybool', {
@@ -176,6 +219,23 @@ suite('djblets/gravy/backboneUtils', function() {
                 expect(model.get('mybool')).toBe(false);
             });
 
+            it("Setting model's property with radioValue", function() {
+                model.set('myvalue', 'one');
+
+                $radio1.bindProperty('checked', model, 'myvalue', {
+                    radioValue: 'one'
+                });
+                $radio2.bindProperty('checked', model, 'myvalue', {
+                    radioValue: 'two'
+                });
+
+                $radio2.click();
+
+                expect($radio1.prop('checked')).toBe(false);
+                expect($radio2.prop('checked')).toBe(true);
+                expect(model.get('myvalue')).toBe('two');
+            });
+
             it("No model changes with elementToModel=false", function() {
                 model.set('mybool', false);
                 $el.bindProperty('checked', model, 'mybool', {
