UserControl从MainWindow获取更新的数据

时间:2019-04-05 04:58:15

标签: c# wpf

我有2个UserControl,其中UserControl应该从MainWindow获取更新的数据

<Window x:Class="BindingUserControl.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:BindingUserControl.Pages"
    xmlns:local1="clr-namespace:BindingUserControl"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">


<Window.Resources>
    <local1:CommonViewModel x:Key="ABC"/>
</Window.Resources>

<Grid>
    <local:UserControl1 DataContext="{Binding Source={StaticResource ABC}}" Margin="0,0,520.6,264"/>
    <TextBox  Width ="100" Height="100" Text="{Binding CommonProperity}"/>
    <Button Width="100" Height="100" RenderTransformOrigin="-1.85,1.404" Margin="139,208,554.6,112" Click="Button_Click"></Button>
</Grid>

UserControl

<UserControl x:Class="BindingUserControl.Pages.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"
         xmlns:Local="clr-namespace:BindingUserControl"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
    <Local:CommonViewModel x:Key="ABC"/>
</UserControl.Resources>
<Grid DataContext="{Binding Source={StaticResource ABC}}" >
    <TextBox Width="100" Height="100" Text="{Binding CommonProperity  ,Mode=TwoWay}" />
</Grid>

Viewmodel

namespace BindingUserControl
{
    class CommonViewModel: INotifyPropertyChanged
    {

        private string _Localtextdata;
        public string CommonProperity
        {
            get { return _Localtextdata; }
            set
            {
                _Localtextdata = value;
                INotifyPropertyChanged("CommonProperity");
            }
        }

        private void INotifyPropertyChanged(string ProperityName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(ProperityName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

}

当Mainwindow文本框获得任何条目时,usercontrol文本框中没有更新的文本。

我的错误在哪里?

1 个答案:

答案 0 :(得分:0)

您应该只创建CommonViewModel一个实例,并让UserControl从窗口继承DataContext。不要在某处显式设置DataContext的{​​{1}}或其任何子元素:

UserControl

<Window x:Class="BindingUserControl.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:BindingUserControl.Pages"
    xmlns:local1="clr-namespace:BindingUserControl"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">

    <!-- Set the DataContext property -->
    <Window.DataContext>
        <local1:CommonViewModel x:Key="ABC"/>
    </Window.DataContext>

    <Grid>
        <local:UserControl1 Margin="0,0,520.6,264"/>
        <TextBox  Width ="100" Height="100" Text="{Binding CommonProperity}"/>
        <Button Width="100" Height="100" RenderTransformOrigin="-1.85,1.404" Margin="139,208,554.6,112" Click="Button_Click"></Button>
    </Grid>
</Window>