2017-01-16 5 views
0

다른보기에있는 combox 상자에서 값을 선택하면 텍스트 상자의 값을 동적으로 변경해야합니다. 종속성 속성의 소스를 변경하면 propertychangedEventHandler 값이 변경되지 않습니다. 즉, null로 남으므로 이벤트가 시작되지 않습니다. 결과적으로 텍스트 상자의 텍스트가 변경되지 않습니다. 아래는 코드입니다. 텍스트 상자의 텍스트를 _name 속성에 바인딩했습니다.속성 변경된 이벤트가 실행되지 않습니다. wpf

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> 

+0

XAML의 바인딩은 어떤 모양입니까? –

+0

이 도움이됩니다 : http : // stackoverflow.com/questions/4237443/datacontext-in-usercontrols – PaulF

+0

당신은'_name'이라는 공개 속성과 _name_ public _field_라는 이름을 가졌습니까? 이것은 명명 규칙을 위반하는 것입니다! – heltonbiker

답변

2

는 당신이 실수로 바인딩 XAML에서 name를 사용하여, name_name를 교환하는 것이 가능합니까?

대개 대문자 이름이있는 공용 속성이 있고 대문자가 아닌 이름이있는 개인 필드가 있으며 선택적으로 앞에 밑줄이 붙습니다.

그래서, 당신은

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

private string _name = ""; 

다음 확인하시기 바랍니다이 있어야합니다

  • 현재 name 대신 _name에 결합하지 않는 경우를;
  • 위의 경우와 그렇지 않은 경우 명명 규칙을 수정하십시오. 오류의 원인이며 위의 규칙을 따르면됩니다.
+0

"으로 시작하고 비 대문자로 된 이름 앞에 밑줄이있는 개인 필드 또는 밑줄이 전혀 없습니다. – Clemens

+0

@ 클레멘스는 잘 대답했다. 나는 대답을 편집했다. – heltonbiker

+0

명명 규칙을 변경했지만 여전히 작동하지 않습니다. –

0

XAML에서 "이름"속성을 바인딩하고 코드에서 _name 속성을 만들었습니다. 따라서 코드의 "Name"속성으로 변경해야합니다.

바로 아래에 따라 당신의 속성을 변경 :

private string _name = ""; 

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

이 시도하고 알려주세요.

+0

나는 그것을했지만 여전히 효과가 없다. 콤보 상자에서 다른 항목을 다른보기로 선택하면이 텍스트가 변경되어야하므로 eventaggregator를 사용해야합니까? –

0

다른보기의 이벤트가 발생하면 동적으로 텍스트 상자의 텍스트를 변경해야하므로 eventaggregator를이 용도로 사용했습니다. 다음은 DropView (목록에서 학생 이름을 선택하는 곳)와 DetailsView (세부 정보를 표시하는 곳)의 C# 코드입니다. 나는 Drop.xaml.cs 이벤트를 게시하고 Details.xaml.cs

Drop.xaml.cs

공공 부분 클래스 드롭에서 해당 이벤트에 가입 : 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을은, {

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(); 
    }  
} 
을에서 INotifyPropertyChanged