Ideally you would put the validation in the products table itself, so that would force the product to have that data at the time of entry. Validation rules aren't really ideal for walking across relationships, so using a trigger to check is a reasonable solution.
You may want to make it an onObjectModify trigger so that user is proactively warned when a product without a price is selected. Rather than when they later try and save the record.
Actually reading into it further, vendor cost IS in products right? It doesn't belong as a field in vendors, as a vendor should have the ability to have their price for each product. Your description wasn't very clear as to which table that vendor price lived in.
Thanks for the reply.
Sorry I wasn't clear about the schema.
It's a many to many relationship. There are 3 tables. Products, Vendors, and ProductVendors.
A product can be purchased from many vendors, and vendor can have many products.
Each vendor will have unique product cost, so the cost and item number are stored in the productVendors join table.
Then yes, the ProductVendors join table should be where you validate for the missing price.