我是 WPF 和 MVVM 的初学者。我在项目中的窗口上有某些控件。例如,我的窗口中有一个文本框。我正在使用 MVVM 模式,在这里我想从视图模型中更改文本框的可见属性。另一件事是,我想根据某些条件从视图模型中更改文本框的可见性。
好吧,我用谷歌搜索了它,谷歌向我提出了一些建议,这些建议都是不同的解决方案,我完全感到困惑。
猜猜有人可以帮我解决这个问题。
我知道这对于 WPF MVVM 专家来说是小菜一碟,但是由于我正在尝试学习这些东西,所以我需要一些代码作为示例。
谢谢
我是 WPF 和 MVVM 的初学者。我在项目中的窗口上有某些控件。例如,我的窗口中有一个文本框。我正在使用 MVVM 模式,在这里我想从视图模型中更改文本框的可见属性。另一件事是,我想根据某些条件从视图模型中更改文本框的可见性。
好吧,我用谷歌搜索了它,谷歌向我提出了一些建议,这些建议都是不同的解决方案,我完全感到困惑。
猜猜有人可以帮我解决这个问题。
我知道这对于 WPF MVVM 专家来说是小菜一碟,但是由于我正在尝试学习这些东西,所以我需要一些代码作为示例。
谢谢
由于这是 MVVM,您不想更改您实际想要禁用某些选项的文本框的可见性。然后 - 该选项是启用还是禁用应该反映您的文本框的可见性。
所以基本上你想要一个Property
在 ViewModel 中,例如:
public bool CanMyPropertyBeChanged {get; set;}
您可以更改哪个(当然,如果您还没有实现 INotifyPropertyChanged
,您可能应该实现)...
并通过转换器将文本框的可见性绑定到此属性:
<TextBox Visibility="{Binding CanMyPropertyBeChanged, Converter={StaticResource boolToVis}}" />
您可以为此使用内置的BooleanToVisibilityConverter:
<BooleanToVisibilityConverter x:Key="boolToVis" />
在您的 XAML 文件中添加以下内容:
<Window.Resources>
<ResourceDictionary>
<BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" />
</ResourceDictionary>
<Window.Resources>
在您的文本框中添加:
<TextBox .... Visibility="{Binding IsVisibleBoolean, Converter={StaticResourcebooleanToVisibilityConverter}}" />
在您的视图模型中添加 IsVisibleBoolean 属性:
public bool IsVisibleBoolean
{
get; set;
}
你可以通过多种方式做到这一点
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();
}
}