2015-05-15 5 views
0

Я новичок в WPF и C#. У меня есть кнопка в моем графическом интерфейсе, которая представлена ​​как изображение. Однако отображаемое изображение зависит от определенных условий. В зависимости от условий кнопка может быть одним из 5 изображений. Я закодирован так:Сопоставление значений свойств с условиями

Вид:

<Button x:Name="bShow" HorizontalAlignment="Left" Margin="200,0,0,0" VerticalAlignment="Top" Width="200" Height="200" > 
     <Image Source="{Binding myShowProp}"/> 

недвижимости myShowProp определяется в MainWindow.xaml.cs:

public string myShowProp // This property decides what image appears inside the button 
{ 
    get { return privProp; } 
    set 
    { 
     privProp = value; 
     OnPropertyChanged("myShowProp"); 
    } 
} 

Рутинная называется SetButtonImage отвечает за логику, которая отображает определенный условий для определенных изображений. Он кодируется внутри MainWindow.xaml.cs как:

private void SetButtonImage() 
{ 
    if (/* condition1 */) 
     myShowProp = image1; 
    else if (/* condition2 */) 
     myShowProp = image2; 
    else if (/* condition3 */) 
     myShowProp = image3; 
    else if (/* condition4 */) 
     myShowProp = image4; 
    else 
     myShowProp = image5; 

} 

Можете ли вы показать мне лучший способ сделать выше, я не представляю себе повсеместное использование if будучи лучший дизайн, кажется, что мне не хватает что нибудь.

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

P.S. Одна из вещей, которую я собираюсь сделать, - это реорганизовать мой существующий код в соответствии с парадигмой MVVM.

+0

Возможно, вы можете использовать статут [switch] (https://msdn.microsoft.com/en-us/library/06tc147t.aspx), но я думаю, вы уже знаете. Проблема заключается в том, что «в зависимости от условий кнопка может быть одним из 5 изображений» связывает вас с этим синтаксисом. Это может быть законной необходимостью или симптомом плохого дизайна в другом месте, я не могу комментировать. –

+0

Почему вы не используете стили для изменения содержимого кнопки для показа изображения? Аналогично, если условия могут быть добавлены в качестве триггеров для стиля. Основное намерение MVVM состоит в том, чтобы иметь наименьший объем кода в коде. – Versatile

ответ

1

Предполагается, что WPF будет использоваться с шаблоном MVVM (Model-View-ViewModel), который использует концепции как DataBinding (уже используемые) и Templating, более конкретно использование (на кнопках) ControlTemplates с триггерами.

Идея будет:

  • Вы бы пяти ImageSources, объявленных в Button.Resources;
  • У вас будет свойство Enum (а не String!) На ViewModel;
  • Ваша кнопка будет иметь DataTemplate, содержащую изображение;
  • Источник изображения будет определяться рядом триггеров, связанных с этим свойством Enum.
+0

Спасибо. Что такое Button.Resources, я не вижу его в документации. –

+0

Каждый элемент управления WPF (кнопки, панели, метки и т. Д.) Может иметь свойство «Ресурсы», которое представляет собой словарь, содержащий ресурсы для этого элемента управления. Обычными ресурсами были бы стили, DataTemplates, ImageSources и т. Д. Просто Google, и вы легко найдете множество примеров. – heltonbiker

0

Долгие утверждения If-Else необходимы, когда у вас есть сложные условия. Если это несколько состояний одного условия, то оператор switch упростит его для вас. Просто убедитесь, что вы вызываете SetButtonImage() в сеттерах для любых свойств, которые используются в этих условиях, и все будет хорошо.

Является ли свойство myShowProp, просто указывая адрес изображения для кнопки, чтобы получить изображение? Если это так, то это место, которое вы можете изменить, чтобы больше соответствовать MVVM. Вы хотите, чтобы свойство просто указывало состояние, предпочтительно имя, описывающее состояние, которое ваш дизайнер GUI затем будет использовать для определения изображения. Он сможет использовать ресурсы и, возможно, триггеры стиля для отображения правильного изображения.

Я работаю с MVVM уже более года, я думаю, что делаю достойную работу, и код, который вы отправили, выглядит хорошо для меня.