0

我必须动态更改文本框中的值,从组合框中选择一个值,该组合框存在于不同的视图中。当更改依赖属性的源时,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>

4

3 回答 3

2

您是否可能不小心交换了nameand _namename在 XAML 中用于绑定?

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

所以,你应该有

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

private string _name = "";

请检查以下内容:

  • 如果您当前没有绑定到name而不是_name;
  • 不管是不是这样,请修正你的命名约定,因为它是错误的来源,你会发现每个示例都遵循我上面包含的约定。
于 2017-01-16T14:05:22.960 回答
0

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

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

private string _name = "";

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

试试这个,让我知道。

于 2017-01-17T06:25:47.167 回答
0

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

删除.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>
 {
 }

详细信息.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();
   }      
}
于 2017-01-18T11:58:04.860 回答