C# 如何将属性(get;set;)分配给WPF用户控件?

C# 如何将属性(get;set;)分配给WPF用户控件?,c#,wpf,inotifypropertychanged,C#,Wpf,Inotifypropertychanged,我正在努力学习C#中的属性(get和set)。我对该语言还是新手,目前正在使用WPF和一些文本框制作一个简单的程序,如图所示 因此,以下是描述: 输入:用户可以在主窗口中键入输入 输出1:它是在MainWindow中查看输入中键入的字符串的位置 输出2:与输出1相同,位于主窗口的选项卡1内 输出3:与输出1相同,位于选项卡2内,仍在主窗口中 输出4:与输出1相同,位于选项卡2内,参考本地用户控件第1页 按钮:“保存”输入的按钮 代码如下: 主窗口:解决方案-->我在local:Page1 &

我正在努力学习C#中的属性(get和set)。我对该语言还是新手,目前正在使用WPF和一些文本框制作一个简单的程序,如图所示

因此,以下是描述:

  • 输入:用户可以在主窗口中键入输入
  • 输出1:它是在MainWindow中查看输入中键入的字符串的位置
  • 输出2:与输出1相同,位于主窗口的选项卡1内
  • 输出3:与输出1相同,位于选项卡2内,仍在主窗口中
  • 输出4:与输出1相同,位于选项卡2内,参考本地用户控件第1页
  • 按钮:“保存”输入的按钮
代码如下: 主窗口:解决方案-->我在
local:Page1

<!-- MainWindow.xaml -->
<Window x:Class="TestGetSet.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:TestGetSet"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <TabControl x:Name="tabControl" HorizontalAlignment="Left" Height="212" Margin="37,20,0,0" VerticalAlignment="Top" Width="447">
        <TabItem Header="TabItem">
            <Grid Background="#FFE5E5E5">
                <TextBox x:Name="output2" HorizontalAlignment="Left" Height="23" Margin="156,76,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120"/>
                <Label x:Name="label2" Content="Output 2" HorizontalAlignment="Left" Margin="156,46,0,0" VerticalAlignment="Top"/>
            </Grid>
        </TabItem>

        <TabItem Header="TabItem">
            <Grid Background="#FFE5E5E5">
                <TextBox x:Name="output3" HorizontalAlignment="Left" Height="23" Margin="321,26,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
                <local:Page1 x:Name="Page1"/>
                <Label x:Name="label3" Content="Output 3" HorizontalAlignment="Left" Margin="321,0,0,0" VerticalAlignment="Top"/>
            </Grid>
        </TabItem>
    </TabControl>

    <TextBox x:Name="input" Text=""/>
    <TextBox x:Name="output1" Text=""/>        
    <Button x:Name="button" Content="Button" Click="button_Click"/>
    <Label x:Name="label" Content="Input" HorizontalAlignment="Left" Margin="37,239,0,0" VerticalAlignment="Top"/>
    <Label x:Name="label1" Content="Output 1" HorizontalAlignment="Left" Margin="364,239,0,0" VerticalAlignment="Top"/>

</Grid>
接下来是Page1.xaml(此处未对解决方案进行任何更改)

最后一个,属性,简单版本:

// myProperty.cs

namespace TestGetSet
{
    public class myProperty
    {
        public string myData { get; set }           
    }
}
已更改InotifyProperty的属性:

// myProperty.cs
using System.ComponentModel;
namespace TestGetSet
{
    public class myProperty : INotifyPropertyChanged
    {
        private string _textdata;

        public string myData {
            get
            {
                return _textdata;
            }
            set
            {
                _textdata = value;
                NotifyPropertyChanged("myData");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}
以下是程序窗口的屏幕截图: 和

正如您所看到的,只有Output4是空的,而其他输出仍然给我结果,即使我没有使用INotifyPropertyChanged。我的问题是为什么,我如何解决这个问题?我想知道这是否是因为我正在使用Page1的UserControl,Output4在其中。我一直在寻找答案,但一无所获。非常感谢您的帮助。多谢各位

好的,我更新了代码。它正在工作。我从以下方面获得了
passingvalue
的参考:


谢谢。

您的问题在于您错误地获取了主窗口的myProperty和Page1的myProperty

在Page1中,您使用
myProp.myData
设置output4.Text,这是错误的,因为myProp是Page1的myProp,永远不会更新

如果您将主窗口的引用传递到Page1,并改为编写类似于
output4.Text=MyMainWindowReference.myProp.myData的内容它将按预期工作

您还可以通过在XAML中命名Page1,为button_Click函数中的output4添加设置:

private void button_Click(object sender, RoutedEventArgs e)
{
    myProp.myData = input.Text;
    output1.Text = myProp.myData;
    output2.Text = myProp.myData;
    output3.Text = myProp.myData;
    Page1.output4.Text = myProp.myData;
}

提供完整的XAML,使其看起来与您的图像完全相同。没有人会费心在代码中添加缺失的部分。在page1的代码隐藏中定义的属性“myprop”是类“myProperty”的新实例,因此它是空的。在MainWindow和Page1中定义的myProperty类型的属性是两个名称相同但属于同一类的不同实例的属性。如果你想“共享”主窗口和页面1之间的属性,你应该考虑使用数据绑定。抱歉。由于您没有使用绑定,因此不必使用INotifyPropertyChanged。尝试在getter中设置一些值,比如公共字符串myData{get{return“Bla”}set}。现在你得到Bla@MatijaK. 当我尝试使用
private string\u textdata=“bambi”
public string myData{get{return\u textdata;}设置{u textdata value;}}
。。。输出4显示bambi很好。我不知道为什么,我现在明白了。所以我只需要将
x:Name=“Page1”
放在MainWindow.xaml中的
local:Page1
旁边。非常感谢你。我将用解决方案更新我的帖子。
// myProperty.cs

namespace TestGetSet
{
    public class myProperty
    {
        public string myData { get; set }           
    }
}
// myProperty.cs
using System.ComponentModel;
namespace TestGetSet
{
    public class myProperty : INotifyPropertyChanged
    {
        private string _textdata;

        public string myData {
            get
            {
                return _textdata;
            }
            set
            {
                _textdata = value;
                NotifyPropertyChanged("myData");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}
private void button_Click(object sender, RoutedEventArgs e)
{
    myProp.myData = input.Text;
    output1.Text = myProp.myData;
    output2.Text = myProp.myData;
    output3.Text = myProp.myData;
    Page1.output4.Text = myProp.myData;
}