2014-01-23 34 views
0

我正在制作一个基本程序,当用户在文本框中输入内容时,标签会更新。我试图使用数据绑定和INotifyPropertyChanged解决这个问题,所以我不想要任何解决方法。我使用了2个按钮,所以我实际上可以看到他们是否更新。这里是我的主类无法从另一个类中的wpf获取标签

namespace TestStringChangeFromAnotherClass 

public partial class MainWindow : Window 
{ 

    textClass someTextClass = new textClass(); 
    public MainWindow() 
    { 

     InitializeComponent(); 

    } 

    public string someString1; 
    public string someString2; 

    private void btn1_Click(object sender, RoutedEventArgs e) 
    { 
     someTextClass.Text1 = tbx1.Text; 
    } 

    private void btn2_Click(object sender, RoutedEventArgs e) 
    { 
     someTextClass.Text2 = tbx1.Text; 
    } 
} 

这里的WPF它

<Window x:Class="TestStringChangeFromAnotherClass.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}" 
    Title="MainWindow" Height="350" Width="525"> 

    <Grid> 
    <Button x:Name="btn1" Content="Button" HorizontalAlignment="Left" Height="36" Margin="29,246,0,0" VerticalAlignment="Top" Width="108" Click="btn1_Click"/> 
    <Button x:Name="btn2" Content="Button" HorizontalAlignment="Left" Height="36" Margin="227,246,0,0" VerticalAlignment="Top" Width="124" Click="btn2_Click"/> 
    <Label x:Name="lbl1" Content="{Binding textClass.Text1}" HorizontalAlignment="Left" Height="37" Margin="74,32,0,0" VerticalAlignment="Top" Width="153"/> 
    <Label x:Name="lbl2" Content="{Binding textClass.Text2, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="38" Margin="74,90,0,0" VerticalAlignment="Top" Width="153"/> 
    <TextBox x:Name="tbx1" HorizontalAlignment="Left" Height="37" Margin="290,32,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="190"/> 

</Grid> 

,你可以看到,我已经使用UpdateSourceTrigger尝试。我也尝试使用“someTestClass.Text1”而不是textClass.Test1,因为这就是我在MainWindow中定义它的方式。这里是我的textClass

namespace TestStringChangeFromAnotherClass 
public class textClass:INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private string text1; 
    public string Text1 
    { 
     get { return text1; } 
     set 
     { 
      text1 = value; 
      NotifyPropertyChanged("Text1"); 
     } 
    } 

    private string text2; 
    public string Text2 
    { 
     get { return text2; } 
     set 
     { 
      text2 = value; 
      NotifyPropertyChanged("Text2"); 
     } 
    } 

    protected void NotifyPropertyChanged(string info) 
    { 

     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
    } 
} 

我无法弄清楚如何让WPF来寻找的Test1 Test2的或字符串在单独的类和更新他们当琴弦改变。我有一个感觉问题在于DataContext,但我无法弄清楚。我也宁愿不使用C#中的DataContext,只在WPF中

更新: 当我调试这个,当它到达NotifyPropertyChanged,PropertyChanged被评估为null。这可能是问题吗?

+0

你有没有尝试在Mainwindow中实现INotifyPropertyChanged呢?因为这是你的数据上下文。 – TylerD87

+0

如果我在MainWindow中添加INotifyPropertyChanged,我得到这个错误-'TestStringChangeFromAnotherClass。MainWindow'没有实现接口成员'System.ComponentModel.INotifyPropertyChanged.PropertyChanged' – darthwillard

+0

也许,我需要做的是尝试让UpdateSourceTrigger查看TextClass类中的PropertyChanged项目? – darthwillard

回答

1

您将DataContext绑定到您的Window,据我所知,它没有textClass属性。它有someTextClass字段textClass类型。为了使您的代码工作,你可以改变someTextClass公共财产:

public textClass someTextClass { get; private set; } 

初始化它在构造函数中:

public MainWindow() 
{ 
    someTextClass = new textClass(); 
    InitializeComponent(); 

} 

,然后更改绑定指向someTextClass财产

<Label x:Name="lbl1" Content="{Binding someTextClass.Text1}" .../> 
<Label x:Name="lbl2" Content="{Binding someTextClass.Text2}" .../> 
+0

将初始化移入构造函数并更改了绑定属性,也将所有属性更改为public,不起作用 – darthwillard

+0

您的代码与我的示例中的完全相同吗?在我发布答案之前,我已经试过这段代码,它现在可以正常工作 – dkozl

+0

。奇怪的。我有它初始化InitializeComponent后。我必须在InitializeComponent之前初始化它?这是为什么?和“获得私人设置”是什么?做? – darthwillard

0

您与MainWindow类本身绑定为DataContext,并尝试访问名为的属性具有要绑定到的属性。

您正在运行到两个问题:

1)您的XAML正试图通过它的类型来引用所需的对象,而不是它的名字。不工作。你的绑定表达式应该看起来像{Binding someTextClass.Text1}(注意路径表达式的第一部分的区别)。

2)你只能绑定到公共事物。你的领域没有定义为公开的,因此是私人的。即使XAML应逻辑地“能够看到”属性,因为它是相同的类,DataBinding只能在公共属性上工作。

3)编辑:你也必须使这个属性。 WPF不会绑定到字段。

通常,使用Snoop将有助于诊断无提示绑定错误。

+0

1.我改变了它的绑定,不工作。我把所有事情都变成了公开的。那也没用。 3.不确定你的意思吗? – darthwillard

+0

而不是'textClass someTextClass = new textClass();',而是使用'public textClass someTextClass {get;在你的构造函数中,添加'someTextClass = new textClass();'[字段和C#中的属性之间的区别是什么?](http://stackoverflow.com/questions/295104/what-是字段和属性之间的区别)可能有助于进一步解释字段和属性。 –

相关问题