WPF:将变量从父xaml传递到usercontrol

时间:2022-11-01 00:04:23

I'm trying to pass int variable from MainWindow.xaml to UserControl. When I'm debbuging myGridSize is always equal zero. I would appreciate any help.

我正在尝试将MainWindow.xaml中的int变量传递给UserControl。当我重新调试myGridSize总是等于零。我将不胜感激任何帮助。

MainWindow.xaml

x:Name="myWindow">
 <Grid>
        <my:SudokuGrid x:Name="mySudokuGrid" myGridSize="{Binding SudokuSize, ElementName=myWindow}">
        </my:SudokuGrid>
</Grid>

MainWindow code

    public static readonly DependencyProperty SudokuSizeProperty =
        DependencyProperty.Register("SudokuSize", typeof(int), typeof(MainWindow), new FrameworkPropertyMetadata(null));
    private int SudokuSize
    {
        get { return (int)GetValue(SudokuSizeProperty); }
        set { SetValue(SudokuSizeProperty, value); }
    }

    public MainWindow()
    {
        SudokuSize = 9;
        InitializeComponent();
    }

UserControl.xaml

x:Name="gridCustom">
    <UniformGrid Name="SudokuUniGrid" Style="{StaticResource CustomGridStyle}">
    </UniformGrid>

UserControl code

    public static readonly DependencyProperty myGridSizeProperty =
        DependencyProperty.Register("myGridSize", typeof(int), typeof(SudokuGrid), new FrameworkPropertyMetadata(null));

    public int myGridSize
    {
        get { return (int)GetValue(myGridSizeProperty); }
        set { SetValue(myGridSizeProperty, value); }
    }


    UniformGrid BuildGrid()
    {
        //myGridSize = 9;           
        UniformGrid theGrid = new UniformGrid();
        for (int i = 0; i < myGridSize * myGridSize; ++i)
        {
            myButton button = new myButton();
            button.cmLen = myGridSize;
            button.Width = 30;
            button.Height = 30;
            button.Tag = i;
            theGrid.Children.Add(button);            
        }
        return theGrid;
    }

    public SudokuGrid()
    {
        InitializeComponent();
        SudokuUniGrid.Children.Add(BuildGrid());
    }

1 个解决方案

#1


4  

A few issues.

一些问题。

Your dependency property needs to be registered to the user control type. Also you need to wait for the user control to be fully loaded before accessing.

您的依赖项属性需要注册到用户控件类型。此外,您需要等待用户控件在访问之前完全加载。

MainWindow.xaml

MainWindow.xaml

<Window x:Class="WpfApplication5.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:WpfApplication5"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525"
        x:Name="myWindow">
    <Grid>
        <local:SudokuUniGrid myGridSize="{Binding SudokuSize, ElementName=myWindow}">
        </local:SudokuUniGrid>
    </Grid>
</Window>

MainWindow.xaml.cs

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public static readonly DependencyProperty SudokuSizeProperty =
        DependencyProperty.Register("SudokuSize", typeof(int), typeof(MainWindow), new FrameworkPropertyMetadata(null));

    private int SudokuSize
    {
        get { return (int)GetValue(SudokuSizeProperty); }
        set { SetValue(SudokuSizeProperty, value); }
    }

    public MainWindow()
    {
        SudokuSize = 9;
        InitializeComponent();
    }
}

SudokiGrid.xaml (user control)

SudokiGrid.xaml(用户控件)

<UserControl x:Class="WpfApplication5.UserControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <UniformGrid x:Name="SudokuUniGrid">
    </UniformGrid>
</UserControl>

SudokiGrid.xaml.cs (user control)

SudokiGrid.xaml.cs(用户控件)

public class SudokuUniGrid : UserControl
{
    public static readonly DependencyProperty myGridSizeProperty =
        DependencyProperty.Register("myGridSize", typeof(int), typeof(UserControl), new FrameworkPropertyMetadata(null));

    public int myGridSize
    {
        get { return (int)GetValue(myGridSizeProperty); }
        set { SetValue(myGridSizeProperty, value); }
    }

    public SudokuUniGrid()
    {
        InitializeComponent();

        Loaded += SudokuUniGrid_Loaded;
    }

    private void SudokuUniGrid_Loaded(object sender, RoutedEventArgs e)
    {
        Console.WriteLine(myGridSize);

        // build here
    }
}

#1


4  

A few issues.

一些问题。

Your dependency property needs to be registered to the user control type. Also you need to wait for the user control to be fully loaded before accessing.

您的依赖项属性需要注册到用户控件类型。此外,您需要等待用户控件在访问之前完全加载。

MainWindow.xaml

MainWindow.xaml

<Window x:Class="WpfApplication5.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:WpfApplication5"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525"
        x:Name="myWindow">
    <Grid>
        <local:SudokuUniGrid myGridSize="{Binding SudokuSize, ElementName=myWindow}">
        </local:SudokuUniGrid>
    </Grid>
</Window>

MainWindow.xaml.cs

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public static readonly DependencyProperty SudokuSizeProperty =
        DependencyProperty.Register("SudokuSize", typeof(int), typeof(MainWindow), new FrameworkPropertyMetadata(null));

    private int SudokuSize
    {
        get { return (int)GetValue(SudokuSizeProperty); }
        set { SetValue(SudokuSizeProperty, value); }
    }

    public MainWindow()
    {
        SudokuSize = 9;
        InitializeComponent();
    }
}

SudokiGrid.xaml (user control)

SudokiGrid.xaml(用户控件)

<UserControl x:Class="WpfApplication5.UserControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <UniformGrid x:Name="SudokuUniGrid">
    </UniformGrid>
</UserControl>

SudokiGrid.xaml.cs (user control)

SudokiGrid.xaml.cs(用户控件)

public class SudokuUniGrid : UserControl
{
    public static readonly DependencyProperty myGridSizeProperty =
        DependencyProperty.Register("myGridSize", typeof(int), typeof(UserControl), new FrameworkPropertyMetadata(null));

    public int myGridSize
    {
        get { return (int)GetValue(myGridSizeProperty); }
        set { SetValue(myGridSizeProperty, value); }
    }

    public SudokuUniGrid()
    {
        InitializeComponent();

        Loaded += SudokuUniGrid_Loaded;
    }

    private void SudokuUniGrid_Loaded(object sender, RoutedEventArgs e)
    {
        Console.WriteLine(myGridSize);

        // build here
    }
}