2010-06-23 55 views
3

我在silverlight中使用一个网格。最初textbox2是不可见的。当我点击文本框1时,我们必须看到可见的文本框2。我尝试如下:使用Silverlight中的MVVM模式设置可见性

<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模式?

+0

其中的Silverlight版本您使用的? – slugster 2010-06-23 09:54:06

+0

MVVM不是没有代码背后。如果你的代码只影响View,那么你并没有违反MVVM的代码。事实上,在您的ViewModel中放置View逻辑对于MVVM来说不仅仅是一个简单的事件处理程序。 – cadrell0 2011-06-09 14:12:56

回答

5

编辑:对不起,我以为你的意思是当另一个焦点时文本框可见,我改变了我的初始答案。

我不能尝试的时刻,但你的文本框的可见性属性绑定到其他的SelectionLength属性,使用valueconverter:

<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."); 
    } 
} 
+0

尽管这可能是一个很好的解决方案,但它并没有回答这个问题:如何使用MVVM做到这一点? – 2010-06-23 11:23:59

+1

我不明白,还有什么要做?所有这些都是在属性绑定中完成的,不需要任何代码隐藏或视图模型。 如果问题确实是关于视图模型的,他可以创建一个,并将Visibility和SelectionLength属性绑定到它。 OP,请澄清。 – Ozan 2010-06-23 13:26:48

0

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

有几个解决方案在那里你: Binding Commands to ANY event EventToCommand Behavior

一旦你做到了,你可以在你的视图模型的命令将在您的视图模型可见性属性,并触发PropertyChanged事件。

用我ViewModelSupport library,虚拟机应该是这样的:

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中visibility属性的ShowTextbox2财产在VM中。

祝你好运。

2

创建视图模型属性

public bool IsVisible 
    { 
     get 
     { 
      return _isVisible; 
     } 

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

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

,这样你们需要一个转换BoolToVisibility转换使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(); 
    } 

现在绑定文本框,并使用转换器这会返回一个布尔值

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

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

就是这样。

0

如果使用MVVM光,你也可以做这样的:

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); 


    } 
} 
相关问题