Question

within a textblock i would like a text, depending on the value of a boolean property. the text has to be taken using a DynamicResource, because of the multiple langauges the application supports.

there are two entries available in the DynamicResources, one for when the property is true, one for when the property is false.

i would like to solve this in xaml, so that the correct DynamicResource is shown, depending on the value of the property.

anybody an idea or this is possible ? (and how ;-) ? thanks.

Was it helpful?

Solution

Below is solution for your problem.

  • ResourceDictionary
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:system="clr-namespace:System;assembly=mscorlib"
                    >
    <system:String x:Key="Lang1">Lang1 Message</system:String>
    <system:String x:Key="Lang2">Lang2 Message</system:String>
</ResourceDictionary>
  • App.xaml
<Application x:Class="MultiLang.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="LangResources.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>
  • MainWindow.xaml

    <Window.Resources>
        <vm:MainWindowViewModel x:Key="mainVM" />
    </Window.Resources>
    
    <Grid DataContext="{StaticResource mainVM}">
    
        <ToggleButton Name="btnLang" IsChecked="{Binding Var}" Content="Change lang" MaxWidth="100" MaxHeight="30">
    
        </ToggleButton>
    
        <TextBlock Margin="5" MaxHeight="30" VerticalAlignment="Top">
            <TextBlock.Style>
                <Style TargetType="{x:Type TextBlock}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=DataContext.Var, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Grid}}" Value="True">
                            <Setter Property="Text" Value="{DynamicResource Lang1}" />
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Path=DataContext.Var, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Grid}}" Value="False">
                            <Setter Property="Text" Value="{DynamicResource Lang2}" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock> 
    </Grid>
    

  • MainWindowViewModel

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace MultiLang
{
    public class MainWindowViewModel: INotifyPropertyChanged
    {
        private bool _var = false;
        public bool Var
        {
            get { return _var; }
            set
            {
                _var = value;
                OnPropertyChanged("Var");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string name)
        {        
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {

                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }
}

Better option is create two language files with same keys but with different values and merged proper files on runtime. In this case you don't have to check boolean property every time!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top