В 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, но я не уход, и я на самом деле не хочу этого. Если Я сделал, я бы вместо этого сохранил фактическое исправить, а затем синхронизировать его с помощью подписка на измененное свойство события Canvas.Left, Canvas.Top, Ширина и высота DP, которые функционально дал бы мне то, что я хочется, но это скорее удобство вещь, чем фактический DP. Кроме того, это очень простой пример, показывающий, о чем я прошу. Реальным примером может быть на основе времени, например, где нет DP уведомления об изменениях в любом случае будут иметь значение.

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

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

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

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

1
Mark A. Donohoe 15 Апр 2011 в 21:08

1 ответ

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

2
Joe White 15 Апр 2011 в 21:49
Если бы я это сделал, зачем тогда вообще использовать второй DP для кэшированного значения? Я бы просто сохранил кэшированный прямоугольник в самом CanvasRect DP. И опять же, другие вещи (другие DP, время, что угодно) могут изменить это кешированное значение, так что оно не только в установщике CanvasRect. Короче говоря, я не думаю, что вы можете использовать DP таким образом. Во всяком случае, не похоже.
 – 
Mark A. Donohoe
15 Апр 2011 в 21:48
1
О, хватка - @Josh Smith отвечает на вопросы WPF на SO!
 – 
dugas
15 Апр 2011 в 22:03
- Должно быть, я неправильно понял ваши точные требования. Несмотря на это, принуждение значения работает для установки, а не для получения.
 – 
Josh Smith
16 Апр 2011 в 00:34
@Thedugas... почему так интересуется Джошем Смитом. Я что-то упускаю? Мы все?!! Чем знамениты люди в этих краях?!!
 – 
Mark A. Donohoe
16 Апр 2011 в 09:43