В зависимости от варианта использования я обычно использовал бы что-то простой как следующее:
abstract class DaysOfWeek
{
const Sunday = 0;
const Monday = 1;
// etc.
}
$today = DaysOfWeek::Sunday;
Однако другие варианты использования могут потребовать большего количества проверки констант и значений. На основе комментариев ниже об отражении, и несколько других примечаний , вот расширенный пример, который может лучше служить намного более широкому диапазону случаев:
abstract class BasicEnum {
private static $constCacheArray = NULL;
private static function getConstants() {
if (self::$constCacheArray == NULL) {
self::$constCacheArray = [];
}
$calledClass = get_called_class();
if (!array_key_exists($calledClass, self::$constCacheArray)) {
$reflect = new ReflectionClass($calledClass);
self::$constCacheArray[$calledClass] = $reflect->getConstants();
}
return self::$constCacheArray[$calledClass];
}
public static function isValidName($name, $strict = false) {
$constants = self::getConstants();
if ($strict) {
return array_key_exists($name, $constants);
}
$keys = array_map('strtolower', array_keys($constants));
return in_array(strtolower($name), $keys);
}
public static function isValidValue($value, $strict = true) {
$values = array_values(self::getConstants());
return in_array($value, $values, $strict);
}
}
Путем создания простого класса Enum, который расширяет BasicEnum, у Вас теперь есть способность использовать методы таким образом для простого контроля ввода:
abstract class DaysOfWeek extends BasicEnum {
const Sunday = 0;
const Monday = 1;
const Tuesday = 2;
const Wednesday = 3;
const Thursday = 4;
const Friday = 5;
const Saturday = 6;
}
DaysOfWeek::isValidName('Humpday'); // false
DaysOfWeek::isValidName('Monday'); // true
DaysOfWeek::isValidName('monday'); // true
DaysOfWeek::isValidName('monday', $strict = true); // false
DaysOfWeek::isValidName(0); // false
DaysOfWeek::isValidValue(0); // true
DaysOfWeek::isValidValue(5); // true
DaysOfWeek::isValidValue(7); // false
DaysOfWeek::isValidValue('Friday'); // false
Как примечание стороны, любое время я использую отражение, по крайней мере, однажды на статическом классе / классе константы, где данные не изменятся (такой как в перечислении), я кэширую результаты тех отражательных вызовов, начиная с использования нового отражения возражает, что каждый раз в конечном счете окажет значимое влияние производительности (Сохраненный в ассоциативном массиве для нескольких перечислений).
Теперь, когда большинство людей имеет наконец обновленный до по крайней мере 5,3, и SplEnum
, доступно, который является, конечно, жизнеспособным вариантом также - пока Вы не возражаете против традиционно неинтуитивного понятия наличия фактического перечисления инстанцирования всюду по Вашей кодовой базе. В вышеупомянутом примере, BasicEnum
и DaysOfWeek
не может быть инстанцирован вообще, и при этом они не должны быть.
Могут ли ваши привязки Ширина
и Высота
мешать? Если вы вообще не устанавливаете Ширина
и Высота
, отображается ли окно в правильном месте? Если да, то находится ли это в том же месте, что и при установке привязок, как указано выше?
Если все это правда, то похоже, что WPF вычисляет местоположение окна до получения значения Width
и Высота
от ваших привязок. Я не уверен, как это обойти - возможно, сначала установите Width
и Height
вручную (либо в XAML, либо в конструкторе), а затем настройте привязки, как только он отображается?
Я не вижу ссылок на поля в ваших примерах. Однако я часто расстраиваюсь, когда Visual Studio меняет поля для элементов (когда они re в сетке) после перетаскивания стороны объекта в дизайнере (я бы подумал, что это изменит его ширину, а не поле). Кроме того, странные поля могут вызвать неожиданные проблемы с размещением.