C# 如何从视图模型(WPF、MVVM)更改文本框的可见属性
我是WPF和MVVM的初学者。我在项目中的窗口上有某些控件。例如,我的窗口中有一个文本框。我使用的是MVVM模式,这里我想更改视图模型中文本框的visible属性。 另一件事是,我想根据一些条件更改viewmodel中文本框的可见性 嗯,我在谷歌上搜索了一下,谷歌给了我一些建议,这些建议都是不同的解决方案,我完全搞不清楚 我想有人能帮我解决这个问题 我知道这对WPF MVVM专家来说是小菜一碟,但由于我正在尝试学习这些东西,所以我需要一些代码作为示例C# 如何从视图模型(WPF、MVVM)更改文本框的可见属性,c#,wpf,mvvm,properties,C#,Wpf,Mvvm,Properties,我是WPF和MVVM的初学者。我在项目中的窗口上有某些控件。例如,我的窗口中有一个文本框。我使用的是MVVM模式,这里我想更改视图模型中文本框的visible属性。 另一件事是,我想根据一些条件更改viewmodel中文本框的可见性 嗯,我在谷歌上搜索了一下,谷歌给了我一些建议,这些建议都是不同的解决方案,我完全搞不清楚 我想有人能帮我解决这个问题 我知道这对WPF MVVM专家来说是小菜一碟,但由于我正在尝试学习这些东西,所以我需要一些代码作为示例 谢谢因为这是MVVM,所以您不想更改文本框的
谢谢因为这是MVVM,所以您不想更改文本框的可见性,实际上您想禁用某些选项。。然后-该选项是启用还是禁用应反映在文本框的可见性上 因此,基本上您希望ViewModel中有一个
属性,例如:
public bool CanMyPropertyBeChanged {get; set;}
您可以更改(当然,如果您还没有更改,您可能应该更改)…
并通过转换器将文本框的可见性绑定到此属性:
<TextBox Visibility="{Binding CanMyPropertyBeChanged, Converter={StaticResource boolToVis}}" />
您可以为此使用内置的:
<BooleanToVisibilityConverter x:Key="boolToVis" />
您可以通过多种方式完成
首先,你可以直接绑定它
XAML
<TextBox Visibility="{Binding myVisibility}"/>
xmlns:local="clr-namespace:yourNamespace">
<Window.Resources>
<local:BooleanToVisibilityConverter x:Key="BooleanToVisibility" />
</Window.Resources>
<TextBox Visibility="{Binding myVisibility,Converter={StaticResource BooleanToVisibility}}"/>
但您也可以使用转换器(推荐的方式)
XAML
<TextBox Visibility="{Binding myVisibility}"/>
xmlns:local="clr-namespace:yourNamespace">
<Window.Resources>
<local:BooleanToVisibilityConverter x:Key="BooleanToVisibility" />
</Window.Resources>
<TextBox Visibility="{Binding myVisibility,Converter={StaticResource BooleanToVisibility}}"/>
BooleanToVisibilityConverter.cs
[ValueConversion(typeof(bool),typeof(Visibility))]
public sealed class BooleanToVisibilityConverter : IValueConverter
{
public bool IsReversed { get; set; }
public bool UseHidden { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var val = System.Convert.ToBoolean(value, CultureInfo.InvariantCulture);
if (this.IsReversed)
{
val = !val;
}
if (val)
{
return Visibility.Visible;
}
return this.UseHidden ? Visibility.Hidden : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
在XAML文件中添加以下内容:
<Window.Resources>
<ResourceDictionary>
<BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" />
</ResourceDictionary>
<Window.Resources>
这个问题很相似,我相信你需要可视化的工具转换器,搜索它吗?到目前为止你尝试过什么吗?事实上,实现这种功能有多种方法。嗨,我需要的是:我有一个文本框a和文本框B。当文本框a的焦点丢失时,(条件)我需要检查文本框a是否为空,如果为空,我需要隐藏文本框B。我们可以使用交互触发器在文本框a的LostFocus事件上放置一个命令,以实现文本框a中的事件处理,但如何将上述条件获取到viewmodel中的命令中。感谢我的解决方案适用于这种情况:TextBoxA和TextboxB都绑定到VM中的属性。让我们分别称它们为PropertyA和PropertyB。无论是在TextBoxA的LostFocus(作为命令)上,还是在PropertyA更改时(在PropertyA的setter中),都可以根据PropertyA是否为空设置CanMyPropertyBechChanged
。当然,TextboxB的可见性绑定到CanMyPropertyBeChanged
propertyAhem,更改通知。您的属性没有更改通知,因此只有一次才有效。此外,您可能还应该阅读框架指南。@Will它还缺少设置视图数据上下文的其余代码,以及文本框的其余属性和许多其他内容,但它只是一个示例,而不是一段正在运行的代码。您的评论不是很有建设性。转换现在是框架的一部分,因此没有任何必要。您的属性也缺少更改通知。@这只是一个简单的示例。。。他说他是wpf mvvm的新手。。。所以请不要试图变得聪明;o)
<TextBox .... Visibility="{Binding IsVisibleBoolean, Converter={StaticResourcebooleanToVisibilityConverter}}" />
public bool IsVisibleBoolean
{
get; set;
}