2015-06-26 6 views
0

Я новичок в WPF MVVM. Вот что делает мой ViewModel:Простой способ в WPF MVVM для повторного использования метода свойств?

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

-Если верно, кнопка установлен в Hidden.

-Если ложь, ярлык с сообщением ("Серверы не Доступные) устанавливается на видимой

Как можно повторно использовать следующий IsVisible метод, чтобы установить видимость лейбла?

using System; 
using System.Diagnostics; 
using System.Windows; 
using System.Windows.Input; 

namespace WpfTest 
{ 
    public class PrnViewModel1 : ViewModelBase 
    { 
     private ICommand m_PrnServPingCommand; 
     private Visibility _isVisible=Visibility.Visible; 


     public PrnViewModel1() 
     { 
      PrnServPingCommand = new RelayCommand(new Action<object>(PrnServPing)); 
     } 

     public ICommand PrnServPingCommand 
     { 
      get 
      { 
       return m_PrnServPingCommand; 
      } 
      set 
      { 
       m_PrnServPingCommand = value; 
      } 
     } 

     public void PrnServPing(object obj) 
     { 
      string[] serverNames = { "svmsimp1", "svmsimp2" }; 
      bool serversArePingable = Cmethods.PingableAll(serverNames); 
      if (serversArePingable) 
      { 
       IsVisible = Visibility.Hidden; //Button is Hidden 
      } 
      else 
      { 
       //*** Label with Message "Servers not pingable" set to visible 
      } 
     } 

     public Visibility IsVisible 
     { 
      get 
      { 
       return _isVisible; 
      } 
      set 
      { 
       _isVisible = value; 
       OnPropertyChanged("IsVisible"); 
      } 
     } 
    } 
} 

ответ

0

You . можно использовать IValueConverter в обратном Visibility на этикетке

Вот пример реализации:

public static class Extensions 
{ 
    public static System.Windows.Visibility Reversed(this System.Windows.Visibility visibility) 
    { 
     if (visibility == System.Windows.Visibility.Visible) 
      visibility = System.Windows.Visibility.Collapsed; 
     else if (visibility == System.Windows.Visibility.Collapsed || visibility == System.Windows.Visibility.Hidden) 
      visibility = System.Windows.Visibility.Visible; 

     return visibility; 
    } 
} 

public class VisibilityReversedConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return ((System.Windows.Visibility)value).Reversed(); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return ((System.Windows.Visibility)value).Reversed(); 
    } 
} 

Использование:

Не забудьте Instantiate преобразователя в Resources. См. here для руководства по конвертерам.

0

Я сам часто использую Visibility типа в ViewModel (во избежание записи преобразователей для управления компоновкой, потому что Hidden != Collapsed).

Здесь необходимо либо 2 свойства, чтобы управлять меткой и видимостью кнопки, либо единственным свойством (bool), чтобы переключать отображаемый и конвертер (с инвертированным параметром или только с двумя преобразователями).

Вот решение, которое использует конвертер и параметров (бонус - MarkupExtension!):

public class SuperConverter : MarkupExtension, IValueConverter 
{ 
    public SuperConverter() { } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value is bool) 
     { 
      bool inverted = false; 
      if (parameter != null && parameter.ToString().Contains("Inverted")) 
       inverted = true; 
      return (inverted && (bool)value || !inverted && !((bool)value)) ? Visibility.Hidden : Visibility.Visible; 
     } 
     throw new InvalidCastException(); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

и использовать его (вы должны иметь bool IsOperationInProgress в ViewModel, значение которого будет переключать отображение текстовой или кнопки):

<TextBlock Visibility="{Binding IsOperationInProgress, Converter={l:SuperConverter}}" ... /> 
<Button Visibility="{Binding IsOperationInProgress, Converter={l:SuperConverter}, ConverterParameter=Inverted}" ... />