Remember, that 'X' in VHDL is not "Dont care", it is "Unknown". '-' is "dont care".
Also, the VHDL rules state that when you compare an array, it looks for that exact string, so
"----1111" is not equal to "11111111"
So, for VHDL 1993, there is a std_match function, that allows you to treat "dont cares" as actual dont cares, and allow a real priority encoder. With your current code, if DATA_in is "10000001", the output will be "ZZZ".
to use std_match, you need to write:
if std_match("-------1", data_in) then data_out <= "000";
elsif std_match("------10", data_in) then data_out <= "001";
elsif std_match("-----100", data_in) then data_out <= "010";
--etc
end if;
That is all well and good, but VHDL 2008 provides what it calls a matching case, statement, that does exactly what you want, and is supported by the newer versions of Quartus:
case? "data_in" is
when "-------1" => data_out <= "000";
when "------10" => data_out <= "001";
--etc