0

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); }
}

3 Answers 3

1

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); }
}
Sign up to request clarification or add additional context in comments.

1 Comment

@user3091374, and note... the TYPEOF for the dependency property is based on YOUR CUSTOM class, not just the generic "UserControl" which you are deriving your class.
0

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;
        }
    }
}

Comments

0

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.