【问题标题】:Property changed event is not getting fired wpf属性更改事件没有被触发 wpf
【发布时间】:2017-01-16 13:52:12
【问题描述】:

我必须动态更改文本框中的值,从组合框中选择一个值,该值出现在不同的视图中。当更改依赖属性的源时,propertychangedEventHandler 值没有改变,即它保持为空,因此事件不会被触发。结果文本框中的文本没有改变。下面是代码。我已将文本框中的文本绑定到 _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>

【问题讨论】:

  • XAML 中的绑定是什么样的?
  • 您有一个名为_name 的公共属性一个名为name 的公共字段?这肯定违反了命名约定!
  • 你能分享 XAML 代码吗
  • 您提供的 XAML 代码如何链接到 UserControl 类?你能分享完整的 XAML 文件吗?怎么改属性?是来自代码吗?是从绑定到不同的控件吗?我们需要更多信息和完整的源文件。

标签: c# wpf xaml inotifypropertychanged prism-6


【解决方案1】:

您是否可能不小心交换了name_name,在XAML 中使用name 进行绑定?

通常你有一个大写名称的公共属性和一个非大写名称的私有字段,可以像你一样使用下划线作为前缀。

所以,你应该有

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

private string _name = "";

请检查以下内容:

  • 如果您当前没有绑定到name 而不是_name
  • 无论是不是这样,请修正您的命名约定,因为它是错误的来源,您会发现每个示例都遵循我上面包含的约定。

【讨论】:

  • "和一个私有字段,其名称为非大写,前缀为下划线",或根本没有下划线。
  • 我改了命名约定,还是不行
  • 那么 XAML 中的绑定呢?你那里也改了吗?绑定属性需要与视图模型中的公共属性同名。
  • 是的,我也这样做了。你能告诉我如何在这种情况下使用事件聚合器。当组合框的选定项在另一个视图中更改时,文本应该会更改。
【解决方案2】:

在您的 XAML 中,您正在绑定“名称”属性,并且在您的代码中,您已经创建了 _name 属性。因此,您需要在代码中将其更改为“名称”属性。

只需按照以下方式更改您的属性:

private string _name = "";

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

试试这个,让我知道。

【讨论】:

  • 我已经这样做了,但仍然无法正常工作。我是否应该使用 eventtaggregator,因为当我在不同的视图中从组合框中选择不同的项目时,此文本应该会发生变化
【解决方案3】:

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

Drop.xaml.cs

公共部分类 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

公共部分类详细信息: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();
   }      
}

【讨论】:

    猜你喜欢
    • 2016-03-01
    • 2016-12-14
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 2014-03-07
    相关资源
    最近更新 更多