Hello!
The Disabled property is a good alternative but note that a disabled control is not submitted and it's always valid (isValid method always return true). As I can judge this behavior is applied for all disabled controls (not only for checkbox).
If you don't have to use these features please use the disabled property as Vladimir suggested.
But if you need it (maybe in the future) here is a solution for you.
As I said earlier I tested the ReadOnly property and it works as expected. Yes, but it was on the Coolite 0.8.2 which is based on ExtJS 2.3.
There (in ExtJS 2.3) was another policy with the readOnly property. As an example for checkbox, it's considered in the onClick function and value changing was prevented by using the stopEvent method.
I can't see any obstacles to use this technique. Also I'm not sure and a little bit curious why it was changed in ExtJS 3.x.x.
Example
<%@ Page Language="C#" %>
<%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Ext.Net Example</title>
<script type="text/javascript">
myOnClick = function(e) {
if ((this.el.dom.checked != this.checked) && !this.readOnly) {
this.setValue(this.el.dom.checked);
}
e.stopEvent();
}
</script>
</head>
<body>
<form runat="server">
<ext:ResourceManager runat="server" />
<ext:Checkbox runat="server" ReadOnly="true">
<CustomConfig>
<ext:ConfigItem Name="onClick" Value="myOnClick" Mode="Raw" />
</CustomConfig>
</ext:Checkbox>
</form>
</body>
</html>