Micro blog about Answer to the Ultimate Question of Life, the Universe, and Everything.
  • Home
    • List all categories
    • Sitemap
  • Downloads
    • WebSphere
    • Hitachi902
    • Hospital
    • Kryptonite
    • OCR
    • APK
  • About me
    • Gallery
      • Italy2022
      • Côte d'Azur 2024
    • Curriculum vitae
      • Resume
      • Lebenslauf
    • Social networks
      • Facebook
      • Twitter
      • LinkedIn
      • Xing
      • GitHub
      • Google Maps
      • Sports tracker
    • Adventures planning
  1. You are here:  
  2. Home
  3. C#
  4. WPF

BooleanToVisibilityConverter

Details
Written by: Stanko Milosev
Category: WPF
Published: 13 June 2014
Last Updated: 06 April 2022
Hits: 13702

Idea was to have one rectangle and on button click do hide / show that rectangle. Easiest way is with BooleanToVisibilityConverter.

XAML looks like this:

<Window x:Class="BooleanToVisibilityConverterExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:viewModel="clr-namespace:BooleanToVisibilityConverterExample.ViewModel"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.Resources>
            <viewModel:BooleanToVisibilityConverterExampleViewModel x:Key="BooleanToVisibilityConverterExampleViewModel" />
            <BooleanToVisibilityConverter x:Key="BoolToVis" />
        </Grid.Resources>
        
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="30" />
        </Grid.RowDefinitions>
        
        <Button DataContext="{StaticResource BooleanToVisibilityConverterExampleViewModel}" Command="{Binding OnClick}" Grid.Row="1" Content="Click Me!" VerticalContentAlignment="Bottom"/>

        <Rectangle x:Name="greenLine"
                    Height="25"
                    Width="25"
                    DataContext="{StaticResource BooleanToVisibilityConverterExampleViewModel}"
                    Visibility="{Binding MyHidden, Converter={StaticResource BoolToVis}, UpdateSourceTrigger=PropertyChanged}"
                    Fill="Green"/>
    </Grid>
</Window>

Note how I declared resource:

<BooleanToVisibilityConverter x:Key="BoolToVis" />

After that in rectangle declaration note:

Visibility="{Binding MyHidden, Converter={StaticResource BoolToVis}, UpdateSourceTrigger=PropertyChanged}"

There is no too much philosophy about code itself, basically everything is happening here:

MyHidden = !MyHidden;
OnPropertyChanged("MyHidden");

Property changed I explained here.

Example you can download from here.

There is also another solution, which I will not explain, since it is a bit more complicated, you have to implement IValueConverter, example for that version you can download from here, and to write that example I was this web site.

Merging of knowledge

Details
Written by: Stanko Milosev
Category: WPF
Published: 18 May 2014
Last Updated: 06 April 2022
Hits: 5059

Idea was to write small app which will have one combo box where user will be able to change template for some list of buttons.

Instead I just made one project where I merged knowledge from this, this, this, and this article.

That is just for my future reference. Example project you can download from here.

Datatemplates in user control

Details
Written by: Stanko Milosev
Category: WPF
Published: 13 May 2014
Last Updated: 13 May 2014
Hits: 6076

Now idea is to have one control inside ItemsControl, and everything that inside UserControl, something like:

<UserControl x:Class="MyUserControl.myControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
      
      <ItemsControl ItemsSource="{Binding myLabels}">
        <ItemsControl.ItemTemplate>
          <DataTemplate>
            <Label Content="{Binding DataContext.myContent, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>
          </DataTemplate>
        </ItemsControl.ItemTemplate>
      </ItemsControl>
      
    </Grid>
</UserControl>

Here notice line:

<Label Content="{Binding DataContext.myContent, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>

This line was taken from here.

My MainWindow.xaml looks like this:

<Window x:Class="UserControlDataContext.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:myUserControl="clr-namespace:MyUserControl;assembly=MyUserControl"
        xmlns:viewModel="clr-namespace:UserControlDataContext.ViewModel"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
      
        <Grid.Resources>
          <viewModel:UserControlDataContextViewModel x:Key="UserControlDataContextViewModel" />
        </Grid.Resources>
      
        <myUserControl:myControl DataContext="{Binding Source={StaticResource UserControlDataContextViewModel}}"/>
      
    </Grid>
</Window>

and view model like:

public class UserControlDataContextViewModel
{
	public string myContent { get; set; }

	public IEnumerable<string> myLabels { get; set; }

	public UserControlDataContextViewModel()
	{
		myContent = "test";
		myLabels = new[] { "test1", "test2" };
	}
}

Example project you can download from here.

DataTrigger

Details
Written by: Stanko Milosev
Category: WPF
Published: 13 May 2014
Last Updated: 13 May 2014
Hits: 6321

In this article I want to extend my ItemsControl.Style, by binding template.

XAML:

<Grid>

	<Grid.Resources>
		<itemsControlItemTemplate:ItemsControlViewModel x:Key="ItemsControlViewModel" />
	</Grid.Resources>

	<ItemsControl DataContext="{StaticResource ItemsControlViewModel}" ItemsSource="{Binding myItemsSource}">

		<ItemsControl.Style>
			<Style TargetType="ItemsControl">
				<Style.Triggers>

					<DataTrigger Binding="{Binding ParentMyItemType}" Value="{x:Static itemsControlItemTemplate:myItemTypes.WrapPanel}">
						<Setter Property="ItemsPanel">
							<Setter.Value>
								<ItemsPanelTemplate>
									<WrapPanel />
								</ItemsPanelTemplate>
							</Setter.Value>
						</Setter>
					</DataTrigger>

					<DataTrigger Binding="{Binding ParentMyItemType}" Value="{x:Static itemsControlItemTemplate:myItemTypes.StackPanel}">
						<Setter Property="ItemsPanel">
							<Setter.Value>
								<ItemsPanelTemplate>
									<StackPanel />
								</ItemsPanelTemplate>
							</Setter.Value>
						</Setter>
					</DataTrigger>

				</Style.Triggers>
			</Style>
		</ItemsControl.Style>

		<ItemsControl.ItemTemplate>
			<DataTemplate>
			
				<DataTemplate.Resources>
					<itemsControlItemTemplate:AnotherModel x:Key="AnotherModel" />
				</DataTemplate.Resources>

				<Label DataContext="{StaticResource AnotherModel}" Content="{Binding myContent}" />

			</DataTemplate>
		</ItemsControl.ItemTemplate>

	</ItemsControl>

</Grid>

Here notice part, for example:

<DataTrigger Binding="{Binding ParentMyItemType}" Value="{x:Static itemsControlItemTemplate:myItemTypes.WrapPanel}">
	<Setter Property="ItemsPanel">
		<Setter.Value>
			<ItemsPanelTemplate>
				<WrapPanel />
			</ItemsPanelTemplate>
		</Setter.Value>
	</Setter>
</DataTrigger>

Where myItemTypes.WrapPanel I declared something like:

public enum myItemTypes
{
	WrapPanel,
	StackPanel
}

and then my view model looks like:

public class ItemsControlViewModel
{
	public IEnumerable<string> myItemsSource { get; set; }

	public myItemTypes ParentMyItemType { get; set; }

	public ItemsControlViewModel()
	{
		myItemsSource = new[] { "Test1", "Test2" };
		this.ParentMyItemType = myItemTypes.WrapPanel;
	}
}

public class AnotherModel
{
	public string myContent { get; set; }

	public AnotherModel()
	{
		myContent = "test2";
	}
}

notice line:

this.ParentMyItemType = myItemTypes.WrapPanel;

with that line I said that I want my style to be with StackPanel.

Example code you can download from here.

  1. Playing with datatemplates
  2. User control datacontext
  3. Playing with ComboBox
  4. Hosting a Windows Forms Control in WPF

Page 3 of 12

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10