Как я могу использовать соглашения Caliburn.Micro для установки текста кнопки и ее действия?

Если у меня есть кнопка в моем представлении с именем, скажем, «Сохранить», я могу добавить свойство «Сохранить» в свою модель представления, и Caliburn.Micro автоматически привяжет его к содержимому моей кнопки. Например:

public string Save { get { return StringResources.Save; } }

Или я могу добавить метод Save в свою ViewModel, и Caliburn.Micro выполнит этот метод при нажатии кнопки. Например:

public void Save() {
    Document.Save();
}

Но что, если я хочу сделать и то, и другое? C# не позволяет мне объявлять метод и свойство с одинаковыми именами. Могу ли я использовать соглашения, чтобы как задать содержимое кнопки, так и действие, которое будет выполняться при ее нажатии?

(Я знаю, что могу вручную связать одно или другое, но я бы предпочел использовать соглашения, если это практично.)

Это общая потребность, поэтому можно подумать, что она будет встроена в Caliburn.Micro, но, похоже, это не так. Я видел некоторый код, который расширяет соглашения для поддержки этого (и я опубликую его как ответ, если не появится ничего лучшего), но это обходной путь с некоторыми причудливыми причудами, поэтому я хотел бы услышать, если кто-нибудь еще сделал эту работу более чистой.

Примечание. Я видел похожий вопрос, но, похоже, это хорошая идея или нет; Я про механику спрашиваю. (Я воздержусь от суждений о том, хорошая ли это идея, пока не увижу механику. (ухмыляется))


person Joe White    schedule 24.10.2011    source источник
comment
Вы играли с созданием конвенции. Или интересно, можно ли было бы реализовать что-то похожее на CanXyz. Ваше соглашение привязывается к методу, но затем ищет XyzContent.   -  person Derek Beattie    schedule 25.10.2011


Ответы (1)


Быстро и грязно

<Button x:Name="Save"><TextBlock x:Name="SaveText"></TextBlock></Button>
person Anders    schedule 18.04.2012