Home > Blockchain >  WPF How to bind object from window to custom user control
WPF How to bind object from window to custom user control

Time:07-09

I need to create a custom user control and pass it from the main window an object. I need to display the object's attribute inside the user control, how can i do it? Thanks in advance.

EDIT: This is my code, what i'm doing wrong?

My custom control:

  public partial class DetailsComponent : UserControl
{

    public static readonly DependencyProperty ModelProperty = DependencyProperty.Register("Model", typeof(bool), typeof(DetailsComponent), new PropertyMetadata(null));

    public ModelClass Model
    {
        get { return (ModelClass)GetValue(ModelProperty); }
        set
        {
            SetValue(ModelProperty, value);

        }
    }


    public DetailsComponent()
    {
        InitializeComponent();
        DataContext = this;
    }
}

usercontrol.xaml.cs:

<UserControl x:Class="WpfApp3.DetailsComponent"
         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" 
         xmlns:local="clr-namespace:WpfApp3"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
<Grid>
    <StackPanel>
        <TextBlock Text="{Binding Name}"></TextBlock></TextBlock>-->
    </StackPanel>
    
</Grid>

MainWindows.xaml:

<Window x:Class="WpfApp3.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:WpfApp3" xmlns:custom="clr-namespace:LoadingSpinnerControl;assembly=LoadingSpinnerControl" xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">

<Grid>
    <local:DetailsComponent Model="{Binding Model}"></local:DetailsComponent>
</Grid>

MainWindows.xaml.cs:

public partial class MainWindow : Window, INotifyPropertyChanged
    {
   
    ModelClass Model = null;

    public MainWindow()
    {
        InitializeComponent();

      

        Model = new ModelClass("hi", "hi", "hi");
        DataContext = this;
    
    }

  }

ModelClass.cs:

 public class ModelClass
{
    public ModelClass(string name, string description, string city)
    {
        Name = name;
        Description = description;
        City = city;
    }

    public string Name { get; set; }
    public string Description { get; set; }
    public string City { get; set; }
}

CodePudding user response:

Model must be defined as a public property for you to be able to bind to it:

public partial class MainWindow : Window
{
    public ModelClass Model { get;  }

    public MainWindow()
    {
        InitializeComponent();
        Model = new ModelClass("hi", "hi", "hi");
        DataContext = this;
    }
}

The DetailsModel should not set its own DataContext property because then you cannot bind to the Model property of its inherited DataContext:

public partial class DetailsComponent : UserControl
{

    public static readonly DependencyProperty ModelProperty = 
        DependencyProperty.Register("Model", typeof(ModelClass), typeof(DetailsComponent), new PropertyMetadata(null));

    public ModelClass Model
    {
        get { return (ModelClass)GetValue(ModelProperty); }
        set { SetValue(ModelProperty, value); }
    }

    public DetailsComponent()
    {
        InitializeComponent();
    }
}

You could bind to the Name property of the Model dependency property using a RelativeSource binding:

<UserControl x:Class="WpfApp3.DetailsComponent"
         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" 
         xmlns:local="clr-namespace:WpfApp3"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <StackPanel>
            <TextBlock Text="{Binding Model.Name, 
                           RelativeSource={RelativeSource AncestorType=UserControl}}" />
        </StackPanel>

    </Grid>
</UserControl
  • Related