New Bee
New Bee

Reputation: 1011

WPF Custom Controls

I've been trying for ever to try and figure this out.

Story: I have one MainWindow and 2 User Controls. When the MainWindow loads One control is visible and the other is not. Once the user enters their data and settings, I need to make the other form visible.

The form that is invisible at startup needs to be initialized, because it is gathering data from the WMI of the computer it is running on. It is also gathering AD Information in preparation for the user.

For some reason I cannot get one form to show the other.

I think this is what I'm supposed to be looking at:

#region Class Variable
    public string ShowSideBar { get { return (String)GetValue(VisibilityProperty); } set { SetValue(VisibilityProperty, value); }}
    public DependencyProperty VisibilityProperty = DependencyProperty.Register("ShowSideBar", typeof(string), typeof(UserControl), null);
    #endregion

This is set in my MainWindow Class, however, I have no idea why I cannot call it from any other usercontrol.

Is there any way to just expose something like this to all my forms from my MainWindow?

public int RowSpan {
   get { return Grid.GetRowSpan(DockPanel1); }
   set {  Grid.SetRowSpan(DockPanel1,value); }
}

Upvotes: 0

Views: 126

Answers (3)

New Bee
New Bee

Reputation: 1011

I fixed the initlized Component but changing.

X:Class="AdminTools.MainWindow.ShowSideBar" to x:Class="AdminTools.MainWindow".

now i have an issues where

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:User="clr-namespace:AdminTools.Controls.User"
        xmlns:Custom="clr-namespace:AdminTools.Controls.Custom"
        xmlns:Bindings="clr-namespace:AdminTools.Functions"
        x:Class="AdminTools.MainWindow"
        Title="MainWindow" Height="691.899" Width="1500"

    >
    <Window.DataContext>
        <Bindings:ShowSideBar />
    </Window.DataContext>

<Bindings:ShowSideBar /> = ShowSideBar does not exist in the namespace clr-namespace:AdminTools.Functions

ShowSideBar: member names cannot be the same as their enclosing type.

Upvotes: 0

Olly
Olly

Reputation: 6026

Firstly, this application would benefit from application of the MVVM pattern.

However, without taking that approach, you can still resolve the problem you have. It would be unusual for a user control to rely on knowing what its parent is. The code behind for your main window would be the better place to put this code. (Not as good as a view model... but that's another story.)

Add to the control that should cause the side bar to be made visible an event, ShowSideBar. Attach a handler in the main window, and use the handler to display the second control. No need for dependency properties here at all.

public class MyControl : UserControl
{
    ...
    public event EventHandler ShowSideBar;

    // Call this method when you need to show the side bar.
    public void OnShowSideBar()
    {
        var s = this.ShowSideBar;
        if (s != null)
        {
            s(this, EventArgs.Empty);
        }
    }
}

public class MainWindow : Window
{
    public MainWindow()
    {
        this.InitializeComponent();
        this.FirstControl.ShowSideBar += (s, e) =>
        {
            this.SecondControl.Visibility = Visibility.Visible;
        }
    }
}

Upvotes: 0

odyss-jii
odyss-jii

Reputation: 2699

Dependency properties must be static. Why is the type string? Should it not be Visibility if you wish to bind the visibility of the controls to it?

Does it have to be a dependency property? You could just use a regular property as well and implement INotifyPropertyChanged, since you are not binding this field to anything, rather binding other things to it.

For a dependency property, try something like this instead:

public static readonly DependencyProperty SideBarVisibilityProperty = DependencyProperty.Register("SideBarVisibility", typeof(Visibility), typeof(MyTemplatedControl), null);
public Visibility SideBarVisibility
{
    get { return (Visibility)GetValue(SideBarVisibilityProperty); }
    set { SetValue(SideBarVisibilityProperty, value); }
}

Upvotes: 1

Related Questions