Настройка видимости с использованием шаблона MVVM в Silverlight - PullRequest
3 голосов
/ 23 июня 2010

Я беру одну сетку в серебряном свете.Изначально textbox2 невидим.Когда я нажимаю на textbox1, мы видим видимое textbox2.Я пробую это, как показано ниже:

<TextBox x:Name="textbox1" SelectionChanged="txt1_SelectionChanged"/>
<TextBox x:Name="textbox2 "  Visibility="Collapsed"/>

private void txt1_SelectionChanged(object sender, RoutedEventArgs e)
{            
    textbox2 .Visibility = Visibility.Visible;
}

Работает нормально.

Но я хочу использовать шаблон MVVM.Поэтому я не хочу использовать eventHandler.Итак, как это сделать, используя шаблон MVVM?

Ответы [ 4 ]

5 голосов
/ 23 июня 2010

edit: извините, я думал, что вы хотите, чтобы текстовое поле было видимым, когда у другого есть фокус, я изменил свой первоначальный ответ.

В данный момент я не могу попробовать его, но вы связываете свойство Visibilityвашего текстового поля для свойства SelectionLength другого, используя преобразователь значений:

<UserControl.Resources>
    <local:IntToVisibilityConverter x:Key="IntToVisibilityConverter" />
</UserControl.Resources>

<Textbox 
  x:name="textbox2" 
  Visibility={Binding SelectionLength, 
              ElementName="textbox1" 
              Converter={StaticResource IntToVisibilityConverter}}
/>

реализуйте преобразователь значений следующим образом:

public class IntToVisibilityConverter : IValueConverter 
{
  public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture)
  {
    return (int)value > 0 ? Visibility.Visible : Visibility.Hidden;
  }

  public Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture) 
  {
    throw new InvalidOperationException("Converter cannot convert back.");
  }
}
2 голосов
/ 15 февраля 2012

Создать свойство в viewmodel

 public bool IsVisible
    {
        get
        {
            return _isVisible;
        }

        set
        {
            if (_isVisible == value)
            {
                return;
            }

            _isVisible = value;
            RaisePropertyChanged("IsVisible");
        }
    }

Возвращает логическое значение, поэтому вам нужен конвертер. BoolToVisibility Converter делает класс BoolToVisibilityConverter

  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (parameter == null)
        {
            return ((bool)value == true) ? Visibility.Visible : Visibility.Collapsed;
        }
        else if (parameter.ToString() == "Inverse")
        {
            return ((bool)value == true) ? Visibility.Collapsed : Visibility.Visible;
        }
        return false;
    }

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

Теперь привязайте TextBox и используйте конвертер

 <UserControl.Resources>
    <local:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
 </UserControl.Resources>

 <Textbox x:name="textbox2" Visibility={Binding IsVisible,
          Converter={StaticResource BoolToVisibilityConverter}}/>

Вот и все.

0 голосов
/ 06 марта 2013

Если вы используете MVVM Light, вы также можете сделать это так:

using System.Windows; //place it at the top of your view model class.

private Visibility _isVisible = Visibility.Collapsed;

public Visibility IsVisible
{
    get
    { return _isVisible; }

    set
    {
        if (_isVisible == value) { return; }

        RaisePropertyChanging(() => IsVisible);

        _passwordMissing = value;

        RaisePropertyChanged(() => IsVisible);


    }
}
0 голосов
/ 23 июня 2010

Самая большая проблема, с которой вы столкнетесь, - это отправка события SelectionChanged в ViewModel.Команды в SL4 работают только при нажатии кнопки, поэтому события TextBox SelectionChanged не могут запускать команды по умолчанию.

Для вас есть несколько решений: Привязка команд к ЛЮБОМУ событию Поведение EventToCommand

Как только вы это сделаете, в вашей ViewModel вы можете получить команду, которая устанавливает свойство Visibility в вашей ViewModel и запускает событие PropertyChanged.

Using my Библиотека ViewModelSupport , виртуальная машина будет выглядеть следующим образом:

public class MyViewModel : ViewModelBase
{
  public Visibility ShowTextbox2
  {
    get { return Get(() => ShowTextbox2, Visibility.Collapsed); }
    set { Set(() => ShowTextbox2, value); }
  }

  public void Execute_SelectionChanged()
  {
    ShowTextbox2 = Visibility.Visible;
  }
}    

}

Затем необходимо связать событие SelectionChanged с командой SelectionChanged в виртуальной машине и атрибутом видимости Textbox2 ссвойство ShowTextbox2 в виртуальной машине.

Удачи.

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