我在银光中采用一格。最初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模式呢?
答案 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);
}
}