В WPF, для DP, есть ли способ использовать функцию для возврата значения по умолчанию или иметь CoerceValue на стороне получателя? - PullRequest
1 голос
/ 15 апреля 2011

В WPF есть исключительный случай, когда мне нужно установить свойство зависимости через XAML, которое на самом деле не сохраняется само по себе, а используется для установки других свойств зависимости.Это довольно легко, поскольку я просто использую CoerceValue, чтобы перехватить изменение, сделать то, что я хочу, с переданным значением, а затем отменить изменение этого свойства.Это означает, что когда я получу это свойство, я все равно получу значение по умолчанию, так как я заблокировал фактическое изменение.Прекрасно работает.

Например, когда я устанавливаю этот искусственный DP CanvasRect = "10,10,40,20", внутренне он фактически устанавливает DP Canvas.Left, Canvas.Top, Width и Height и CanvasRectсамо по-прежнему остается с его значением по умолчанию "0,0,0,0".

Однако у меня была идея, что если бы я вместо этого прочитал свойство, я хотел бы повторно гидратировать это значение на основена эти другие свойства зависимости.Это может быть сделано с помощью простой однострочной функции ...

return new rect(Canvas.GetLeft(this), Canvas.GetTop(this), Width, Height);

Думайте об этом как о CoerceValue, но на стороне получателя, а не установщика.Тем не менее, я не уверен, как, или даже если вы можете использовать функции, чтобы привести значения обратного чтения, как это.

Примечание. Да, я знаю, что этот метод сделает недействительными любые уведомления об изменениях для CanvasRect DP, но мне все равно, и я на самом деле этого не хочу.Если бы я это сделал, я бы вместо этого сохранил фактический прямоугольник, а затем синхронизировал его, подписавшись на события измененных свойств DP Canvas.Left, Canvas.Top, Width и Height, которые функционально дали бы мне то, что я хочу, ноэто скорее удобство, чем фактический DP.Плюс это очень простой пример, чтобы показать, что я спрашиваю.Пример из реальной жизни может быть основан на времени, например, когда никакие уведомления об изменении DP не будут иметь значения в любом случае.

Теперь я знаю, что мог бы также просто реализовать то, что я хотел, в геттередля свойства оболочки .NET, но при чтении через привязки и тому подобное, оболочка свойства .NET игнорируется, поэтому MSDN говорит, что никогда не использует его ни для чего, кроме удобного делегирования DP.Плюс, на самом деле, для чего-то другого, кроме OneTime, это все равно не имело бы смысла, поскольку, опять же, никаких уведомлений об изменениях не происходило бы.вставьте в геттер, я не уверен, что могу придумать другой способ, кроме как подключить все эти уведомления об изменениях для соответствующих DP.

Еще один пример того, почему вы можете захотеть сделать это, потому что вы хотитеиспользовать преобразователь значений для возвращаемого значения в самом получателе свойств, возможно, чтобы сохранить возвращаемые значения в определенном диапазоне, но не потерять фактические сохраненные значения для других внутренних целей.

Но вернемся к основному вопросуздесь: есть ли способ использовать функцию в качестве значения по умолчанию для DP, или, по крайней мере, CoerceValue на стороне получателя?

1 Ответ

2 голосов
/ 15 апреля 2011

Приведение значения применяется только к изменению действующего значения DP.Это не относится к чтению значения DP.Вы можете создать другой DP, которому назначено значение CanvasRect, например CachedCanvasRect, и обновить кэшированный DP, когда CanvasRect изменит значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...