财产变更事件未被解雇wpf

时间:2017-01-16 13:52:13

标签: c# wpf xaml inotifypropertychanged prism-6

我必须动态地更改文本框中的值,方法是从另一个视图中显示的combox框中选择一个值。更改依赖项属性的源时,propertychangedEventHandler值不会更改,即它保持为null,因此事件不会被触发。因此,文本框中的文本不会更改。下面是代码。我已将文本框中的文本绑定到_name属性。

public partial class Details : UserControl, INotifyPropertyChanged
{

   public event PropertyChangedEventHandler PropertyChanged;
   public string name = "";

     public Details()
     {
       InitializeComponent();
       Name = Connector.Name;
       DataContext = this;
     }


    public string Name
    {
       get { return name; }
       set
       {
           name = value; OnPropertyChanged("Name");
       }
   }

   protected void OnPropertyChanged(string s)
   {
         PropertyChangedEventHandler handler = PropertyChanged;
         if (handler != null)
         {
             handler(this, new PropertyChangedEventArgs(s));
         }
   }
}

Xaml代码

        

    <StackPanel Orientation="Vertical">

            <TextBlock Text="Student Details" VerticalAlignment="Top" HorizontalAlignment="Center" FontSize="16" FontWeight="Bold">  </TextBlock>

            <StackPanel Margin="0,5" Orientation="Horizontal" >

        <Label MinWidth="100" MaxWidth="110">Name:</Label>

                <Border BorderBrush="Gray" BorderThickness="2">

                    <TextBox Name="nametextbox" Text="{Binding Name,Mode=TwoWay}"  Width="auto" MinWidth="100" FontWeight="Black"></TextBox>
                </Border>

            </StackPanel>

3 个答案:

答案 0 :(得分:2)

您是否有可能在XAML中使用name意外地与_namename进行了交换?

通常,您拥有一个大写名称的公共属性,以及一个非大写名称的私有字段,可选择使用下划线作为前缀。

所以,你应该

public string Name {
    get { return _name; }
    set { _name = value; OnPropertyChanged("Name"); }
{

private string _name = "";

请检查以下内容:

  • 如果您目前没有绑定name而不是_name;
  • 如果是或不是这种情况,请修改您的命名约定,因为它是错误的来源,您找到的每个示例都遵循我上面列出的惯例。

答案 1 :(得分:0)

在您的XAML中,您具有约束力&#34;名称&#34;属性,在您的代码中,您已创建_name属性。因此,您需要将其更改为&#34; Name&#34;代码中的属性。

只需按以下方式更改您的财产:

awk

试试这个并告诉我。

答案 2 :(得分:0)

我为此目的使用了eventaggregator,因为我们需要在触发不同视图中的事件时动态更改文本框中的文本。下面是DropView(我们从列表中选择学生姓名)和DetailsView(我们显示详细信息)的C#代码。我在Drop.xaml.cs中发布事件并在Details.xaml.cs

中订阅这些事件

Drop.xaml.cs

public partial class Drop:UserControl     {

    private IEventAggregator iEventAggregator;

    public Drop(IEventAggregator ieventaggregator)
    {
        InitializeComponent();
        iEventAggregator = ieventaggregator;
        this.DataContext = this;
        var doc = XDocument.Load("C:\\Users\\srinivasaarudra.k\\Desktop\\students.xml");           
        var names = doc.Descendants("Name");
        foreach (var item in names)
        {
            droplist.Items.Add(item.Value);
        }

    }
    public string name;
    public string Naam
    {
        get { return name; }
        set { name = value;
        iEventAggregator.GetEvent<Itemselectedevent>().Publish(Naam);
        }

    }
    public string grade;
    public string Grade
    {
        get { return grade; }
        set
        {
            grade = value;
            iEventAggregator.GetEvent<gradeevent>().Publish(Grade);
        }
    }
    public string dept;
    public string Dept
    {
        get { return dept; }
        set
        {
            dept = value;
            iEventAggregator.GetEvent<deptevent>().Publish(Dept);
        }
    }
    public static string str;
    public static string Str
    {
        get { return str; }
        set {
            str = value;

             }
    }

    private void droplist_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
      var sel = droplist.SelectedValue;
      Str=sel.ToString();
      XmlDocument doc2 = new XmlDocument();
      doc2.Load("C:\\Users\\srinivasaarudra.k\\Desktop\\students.xml");
      var details = doc2.DocumentElement.SelectNodes("/Students/StudentDetails");
      foreach (XmlNode node in details)
      {
          if (node.SelectSingleNode("Name").InnerText == Str)
          {
              Naam = node.SelectSingleNode("Name").InnerText;
              Grade = node.SelectSingleNode("Grade").InnerText;
              Dept = node.SelectSingleNode("Department").InnerText;

          }

      }
    //  Details det = new Details();  
      Details dt = new Details(iEventAggregator);

    }


}
 public class Itemselectedevent:Prism.Events.PubSubEvent<string>
    {

    }
 public class gradeevent : Prism.Events.PubSubEvent<string>
 {

 }
 public class deptevent : Prism.Events.PubSubEvent<string>
 {
 }

Details.xaml.cs

public partial class Details:UserControl,INotifyPropertyChanged     {

    public IEventAggregator iEventAggregator;

   public  event PropertyChangedEventHandler PropertyChanged;

   public static string name;
   public static string dept;
   public static string grade;

   [Bindable(true)]
   public  string Naam
   {
       get { return name; }
       set
       { 
        name = value;
        OnPropertyChanged("Naam");
       }

   }
   [Bindable(true)]
   public string Grade
   {
       get { return grade; }
       set
       {

               grade = value; OnPropertyChanged("Grade");

       }
   }
   [Bindable(true)]
   public string Dept
   {
       get { return dept; }
       set
       {

               dept = value;
               OnPropertyChanged("Dept");

       }
   }
   public Details(IEventAggregator eventaggregator)
   {
       InitializeComponent();
       this.iEventAggregator = eventaggregator;
       iEventAggregator.GetEvent<Itemselectedevent>().Subscribe((str) => { Naam = str; });
       iEventAggregator.GetEvent<gradeevent>().Subscribe((str) => { Grade = str; });
       iEventAggregator.GetEvent<deptevent>().Subscribe((str) => { Dept = str; });          
       this.DataContext = this;           
   }

   protected void OnPropertyChanged(string s)
   {
         PropertyChangedEventHandler handler = PropertyChanged;          
         if (handler != null)
         {
             handler(this, new PropertyChangedEventArgs(s));
         }            
   }
   private void Button_Click_1(object sender, RoutedEventArgs e)
   {  
     Application.Current.Shutdown();
   }      
}