How to set the visibility of your WPF user interface item so that it may be hidden/collapsed or shown as desired
Step 1: Create a new WPF Application
Step 2: Modify the MainWindow.xaml to create a User control
Let’s keep it simple – a button:
<Window x:Class="VisbilityBinding.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:VisbilityBinding" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <Grid> <Button Width="100" Height="30" Content="OK!" /> </Grid> </Window>
Step 3: Create the ViewModel classes
This is primarily to implement the INotifyPropertyChanged members
BaseViewModel.cs
using System; using System.ComponentModel; using System.Diagnostics; namespace VisibilityBinding { public abstract class BaseViewModel : INotifyPropertyChanged { #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; #endregion protected void OnPropertyChanged(string propertyName) { VerifyPropertyName(propertyName); PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } [Conditional("DEBUG")] private void VerifyPropertyName(string propertyName) { if (TypeDescriptor.GetProperties(this)[propertyName] == null) throw new ArgumentNullException(GetType().Name + " does not contain property: " + propertyName); } } }
MainWindowViewModel.cs
namespace VisibilityBinding { public class MainWindowViewModel : BaseViewModel { private bool _hasInstalled; public MainWindowViewModel() { HasInstalled = false; } public bool HasInstalled { get { return _hasInstalled; } private set { _hasInstalled = value; OnPropertyChanged("HasInstalled"); } } } }
Step 4: Update the MainWindow.xaml to bind to this visibility property
Nexct up is to update the MainWindow.xaml by including the DataContext, Visibility converter etc:
<Window x:Class="BindingVisibility.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:BindingVisibility" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525" d:DataContext="{d:DesignInstance Type=local:MainWindowViewModel, IsDesignTimeCreatable=True}"> <Window.DataContext> <local:MainWindowViewModel/> </Window.DataContext> <Window.Resources > <BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter" /> </Window.Resources> <Grid> <Button Visibility="{Binding HasInstalled, Converter={StaticResource BoolToVisibilityConverter}}" Width="100" Height="30" Content="OK!" /> </Grid> </Window>
Step 5: Try it!
So that when switch HasInstalled = false the OK button disappears:
And by reinstating HasInstalled = true the OK button is visible again: