利用设置在Silverlight MVVM模式能见度

我需要一个网格在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模式。 所以,我不希望使用事件处理程序。 因此,如何做到这一点使用MVVM模式?

--------------解决方案-------------

编辑:对不起,我以为你说的时候,另外一个具有焦点的文本框是可见的,我改变了我的inital的答案。

此刻我不能尝试,但你绑定你的文本到其他的SelectionLength属性的Visibility属性,使用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.");
}
}

在创建视图模型属性

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

就是这个。

你将有最大的问题越来越发送到视图模型SelectionChanged事件。 在SL4命令只能在按钮的点击,所以文本框的SelectionChanged事件无法在默认情况下开火的命令。

有几个解决方案在那里为你:绑定命令对任何事件EventToCommand行为

一旦你这样做,你可以在你的视图模型,设置您的视图模型可见性属性,并触发PropertyChanged事件的命令。

用我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财产。

祝你好运。

如果您正在使用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);

}
}

分类:Silverlight的 时间:2015-03-15 人气:2
本文关键词: Silverlight的
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.162 (s). 10 q(s)