Vincular un valor de ruta a una propiedad de un objeto que forma parte de viewmodel

Tengo la siguiente ruta:

            routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

y utilizo el ViewModel:

namespace MvcApplication1.Models
{
    public class ProductViewModel
    {

        public ProductViewModel()
        {
            ProductDetail = new ProductInfo();
        }

        public ProductInfo ProductDetail { get; set; }

    }

    public class ProductInfo
    {
        public string Name { get; set; }
        public int ProductID { get; set; }
    }

}

Necesito una forma de enlazar el ID de parámetro de la ruta a Model.ProductDetail.ProductID.

/ Productos / Display / 2 debe llevar a:

Model.ProductDetail.ProductID == 2

Sé que esto parece un poco extraño: sería mucho más simple si mi ViewModel solo fuera

clase pública ProductViewModel {identificación pública int {get; set;}}

Para el manejo de parciales prefiero usar agregación. Realmente no puedo tener ID en la clase principal de ViewModel.

Estoy bastante seguro de que necesito implementar mi propio ModelBinder, pero no veo dónde debo implementar mis propias reglas.

¿Cómo puedo asignar el parámetro de ruta "id" a la propiedad Model.ProductDetail.ProductID?

EDITAR:

Así es como se hace.

    public class ProductModelBinder: DefaultModelBinder
{
    protected override void BindProperty(
        ControllerContext controllerContext,
        ModelBindingContext bindingContext, 
        System.ComponentModel.PropertyDescriptor propertyDescriptor
        )    {
            if (bindingContext.ModelType == typeof(ProductViewModel)
            && String.Compare(propertyDescriptor.Name, "ProductDetail", true) == 0)     
            {         
                int id = int.Parse((string)controllerContext.RouteData.Values["id"]);
                ProductViewModel productView = bindingContext.Model as ProductViewModel;
                productView.ProductDetail.ProductID = id;           
                return;       
         }       
        base.BindProperty(controllerContext, bindingContext, propertyDescriptor);    }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta