5

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

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

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

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

谢谢

4

3 回答 3

4

由于这是 MVVM,您不想更改您实际想要禁用某些选项的文本框的可见性。然后 - 该选项是启用还是禁用应该反映您的文本框的可见性。

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

public bool CanMyPropertyBeChanged {get; set;}

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

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

您可以为此使用内置的BooleanToVisibilityConverter

<BooleanToVisibilityConverter x:Key="boolToVis" />
于 2013-03-21T11:17:21.133 回答
2

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

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

在您的文本框中添加:

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

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

public bool IsVisibleBoolean 
{
    get; set;
}
于 2013-03-21T11:20:54.967 回答
1

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

首先你可以直接绑定它

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();
    }
}
于 2013-03-21T11:18:59.053 回答