UserControl和MainWindow之间的关系

时间:2013-06-03 12:52:44

标签: c# wpf binding user-controls

如何才能从UserControl和父MainWindow(反之亦然)访问数据/属性?例如,假设我的TextBox中有一个MainWindow,名为mainTextBox。然后,我创建一个UserControl,其中TextBox名为ucTextBox。我还在ucButton中有一个名为UserControl的按钮,该按钮应使用值MessageBox的产品弹出mainTextBox.Text * ucTextBox.Text(转换为double,以使其正常工作)。< / p>

我真正想知道的是如何动态地实现这一点,使用一个允许创建更多UserControls能够与父进行交互的按钮。在这种情况下,为每个UserControl命名是没有意义的。

我尝试了几件事,主要是使用get,设置属性但没有预期的结果。 我不确定是否需要使用UserControl,但似乎我已经读过CustomControl用于深度定制,但我不需要。

1 个答案:

答案 0 :(得分:2)

这里有一个简单的示例来帮助您入门(以及@Adriano先生的意思):

<强> RootViewModel.cs

public class RootViewModel :INotifyPropertyChanged
{
    #region Implementation of INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged = delegate {};

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion

    private double _x;
    private double _y;

    public double X
    {
        get { return _x; }
        set
        {
            _x = value;
            OnPropertyChanged("X");
        }
    }

    public double Y
    {
        get { return _y; }
        set
        {
            _y = value;
            OnPropertyChanged("Y");
        }
    }

    public double XY
    {
        get { return _x * _y; }
    }
}

<强> UserControl1.xaml

<UserControl x:Class="WpfApplication2.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:DesignWidth="200">
<Grid>
    <GroupBox Header="User Control">
        <StackPanel>
            <Label Content="Y:" />
            <TextBox Text="{Binding Path=Y, UpdateSourceTrigger=PropertyChanged, FallbackValue=1}" Margin="5" />
            <Button Content="Press me" Click="OnButtonClick" />
        </StackPanel>
    </GroupBox>
</Grid>

<强> UserControl1.xaml.cs

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    private void OnButtonClick(object sender, RoutedEventArgs e)
    {
        var viewModel = (RootViewModel)DataContext;
        var resultMessage = string.Format("{0} * {1} = {2}", viewModel.X, viewModel.Y, viewModel.XY);

        MessageBox.Show(resultMessage, "X * Y");
    }
}

<强> MainWindow.xaml:

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfApplication21="clr-namespace:WpfApplication2"
    Title="Main Window" Height="350" Width="525">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition />
    </Grid.RowDefinitions>
    <StackPanel>
        <Label Content="X:" />
        <TextBox Text="{Binding Path=X, UpdateSourceTrigger=PropertyChanged, FallbackValue=1}" Margin="5" Height="24" />
    </StackPanel>
    <WpfApplication21:UserControl1 Grid.Row="1" Margin="5" />
</Grid>

<强> MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        DataContext = new RootViewModel
        {
            X = 5,
            Y = 7
        };
    }
}