在Silverlight中使用MVVM模式设置可见性

时间:2010-06-23 09:46:10

标签: silverlight

我在银光中采用一格。最初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 个答案:

答案 0 :(得分:5)

编辑:抱歉,我认为你的意思是当另一个人有焦点时文本框可见,我改变了我的初步答案。

我目前无法尝试,但您使用valueconverter将文本框的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.");
  }
}

答案 1 :(得分:2)

在viewmodel中创建属性

 public bool IsVisible
    {
        get
        {
            return _isVisible;
        }

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

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

这会返回一个布尔值,所以你需要一个转换器BoolToVisibility Converter make BoolToVisibilityConverter class

  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}}/>

就是这样。

答案 2 :(得分:0)

您将遇到的最大问题是将SelectionChanged事件发送到ViewModel。 SL4中的命令仅适用于按钮单击,因此默认情况下TextBox SelectionChanged事件无法触发命令。

有一些解决方案适合您: Binding Commands to ANY event EventToCommand Behavior

完成后,您可以在ViewModel中设置一个命令,在ViewModel中设置Visibility属性并触发PropertyChanged事件。

使用我的ViewModelSupport library,VM看起来像这样:

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事件绑定到VM中的SelectionChanged命令,将Textbox2 visibility属性绑定到VM中的ShowTextbox2属性。

祝你好运。

答案 3 :(得分:0)

如果您使用的是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);


    }
}