【问题标题】:How to change the visible property of the text box from the view model ( WPF, MVVM)如何从视图模型(WPF,MVVM)更改文本框的可见属性
【发布时间】:2013-03-10 20:31:33
【问题描述】:

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

好吧,我用谷歌搜索了它,谷歌向我提出了一些建议,这些建议都是不同的解决方案,我完全糊涂了。

猜猜有人可以帮我解决这个问题。

我知道这对 WPF MVVM 专家来说是小菜一碟,但由于我正在尝试学习这些东西,所以我需要一些代码作为示例。

谢谢

【问题讨论】:

  • 我相信你需要VisibilityToBooleanConverter,一定要搜索一下
  • 到目前为止你有没有尝试过?事实上,有多种方法可以实现这样的功能。

标签: c# wpf mvvm properties


【解决方案1】:

在您的 XAML 文件中添加以下内容:

<Window.Resources>
        <ResourceDictionary>
            <BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" />
        </ResourceDictionary>
<Window.Resources>

在您的文本框中添加:

<TextBox .... Visibility="{Binding IsVisibleBoolean, Converter={StaticResourcebooleanToVisibilityConverter}}" />

在您的视图模型中添加 IsVisibleBoolean 属性:

public bool IsVisibleBoolean 
{
    get; set;
}

【讨论】:

  • 您的属性没有更改通知,所以这只会一次。此外,您可能应该阅读框架指南。
  • @Will 它还缺少设置视图数据上下文的其余代码,以及文本框的其余属性和许多其他内容,但它应该是一个例子,而不是一段正在运行的代码。你的 cmets 没有真正的建设性。
  • 我使用下面的 g 使它工作
【解决方案2】:

因为这是 MVVM,你不想改变文本框的可见性你实际上想要禁用一些选项..然后 - 该选项是启用还是禁用应该反映您的文本框的可见性。

所以基本上你想在 ViewModel 中有一个Property,例如:

public bool CanMyPropertyBeChanged {get; set;}

您可以更改哪些内容(当然,如果您还没有,您可能应该 implement INotifyPropertyChanged)...
并通过转换器将文本框的可见性绑定到此属性:

<TextBox Visibility="{Binding CanMyPropertyBeChanged, Converter={StaticResource boolToVis}}" />

您可以为此使用内置的 BooleanToVisibilityConverter

<BooleanToVisibilityConverter x:Key="boolToVis" />

【讨论】:

  • 嗨,我需要的是:我有一个文本框A和文本框B。当文本框A的焦点丢失时,(条件)我需要检查文本框A是否为空如果为空,我需要隐藏文本框 B。我们可以使用交互触发器对文本框 A 的 LostFocus 事件发出命令,以实现文本框 A 中的事件处理,但是如何将上述条件获取到视图模型中的命令.谢谢
  • 我的解决方案适用于这种情况:TextBoxA 和 TextboxB 都绑定到 VM 中的属性。让我们分别称它们为 PropertyA 和 PropertyB。在 TextBoxA 的 LostFocus 上(作为命令)当 PropertyA 更改时(在 PropertyA 的设置器中),您根据 PropertyA 是否为空来设置 CanMyPropertyBeChanged。当然,TextboxB 的可见性绑定到CanMyPropertyBeChanged 属性
  • 咳咳,更改通知。
【解决方案3】:

你可以通过多种方式做到这一点

首先可以直接绑定

XAML

<TextBox  Visibility="{Binding myVisibility}"/>

虚拟机属性

public Visibility myVisibility
    {
        get { return Visibility.Hidden; }
    }

但您也可以使用转换器(推荐方式)

XAML

  xmlns:local="clr-namespace:yourNamespace">
<Window.Resources>
    <local:BooleanToVisibilityConverter x:Key="BooleanToVisibility" />
</Window.Resources>

<TextBox  Visibility="{Binding myVisibility,Converter={StaticResource BooleanToVisibility}}"/>

虚拟机属性

public bool myVisibility
    {
        get { return false; }
    }

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

【讨论】:

  • 转换现在是框架的一部分,所以没有任何必要。您的属性也缺少更改通知。
  • @这只是一个简单的例子......他告诉他他是 wpf mvvm 的新手......所以请不要试图变得聪明;o)
猜你喜欢
  • 1970-01-01
  • 2016-07-12
  • 2013-03-15
  • 1970-01-01
  • 2011-08-12
  • 2013-10-30
  • 2012-03-12
  • 2019-09-02
  • 2021-06-04
相关资源
最近更新 更多