C# 如何从视图模型(WPF、MVVM)更改文本框的可见属性

C# 如何从视图模型(WPF、MVVM)更改文本框的可见属性,c#,wpf,mvvm,properties,C#,Wpf,Mvvm,Properties,我是WPF和MVVM的初学者。我在项目中的窗口上有某些控件。例如,我的窗口中有一个文本框。我使用的是MVVM模式,这里我想更改视图模型中文本框的visible属性。 另一件事是,我想根据一些条件更改viewmodel中文本框的可见性 嗯,我在谷歌上搜索了一下,谷歌给了我一些建议,这些建议都是不同的解决方案,我完全搞不清楚 我想有人能帮我解决这个问题 我知道这对WPF MVVM专家来说是小菜一碟,但由于我正在尝试学习这些东西,所以我需要一些代码作为示例 谢谢因为这是MVVM,所以您不想更改文本框的

我是WPF和MVVM的初学者。我在项目中的窗口上有某些控件。例如,我的窗口中有一个文本框。我使用的是MVVM模式,这里我想更改视图模型中文本框的visible属性。 另一件事是,我想根据一些条件更改viewmodel中文本框的可见性

嗯,我在谷歌上搜索了一下,谷歌给了我一些建议,这些建议都是不同的解决方案,我完全搞不清楚

我想有人能帮我解决这个问题

我知道这对WPF 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;
}