Search code examples
c#wpfbindingdatatemplate

Binding DataTemplate Control Property


I have a UserControl like the following:

<UserControl>
    <Expander> 
        <Expander.HeaderTemplate>
            <DataTemplate>
                <Grid HorizontalAlignment="{Binding Path=HorizontalAlignment, RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}, Mode=OneWayToSource}">
                    <TextBlock Text="{Binding Path=Service, Mode=TwoWay}"/>
                </Grid>
            </DataTemplate>
        </Expander.HeaderTemplate>            
    </Expander>
</UserControl>

I want to bind the Text property of the TextBlock control to a property of my UserControl class, like for example:

public string Service
{ get; set; }

How can I do?


Solution

  • Try setting the DataContext to the UserControl so you can access the properties

    In this situation I have named the UserControl "UI" (Name="UI") so you can bind using ElementName Text="{Binding ElementName=UI, Path=Service}"

    Example:

    <UserControl x:Class="WpfApplication8.UserControl1"
                 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" Name="UI">
        <Expander>
            <Expander.HeaderTemplate>
                <DataTemplate>
                    <Grid HorizontalAlignment="{Binding Path=HorizontalAlignment, RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}, Mode=OneWayToSource}">
                        <TextBlock Text="{Binding ElementName=UI, Path=Service}" />
                    </Grid>
                </DataTemplate>
            </Expander.HeaderTemplate>
        </Expander>
    </UserControl>
    

    Code:

    I have implemented INotifyPropertyChanged this will allow the UI to be updated when Service string changes

    public partial class UserControl1 : UserControl, INotifyPropertyChanged
    {
        public UserControl1()
        {
            InitializeComponent();
            Service = "Test";
        }
    
        private string _service;
        public string Service
        {
            get { return _service; }
            set { _service = value; NotifyPropertyChanged("Service"); }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }
    }
    

    Result:

    enter image description here