2012-01-18 2 views
0

아래 TextBlock의 Text 속성에 대해 PropertyChanged 이벤트에서 사용되는 속성 이름을 정확하게 결정하는 방법을 알아 내려고합니다.PropertyChanged 이벤트의 올바른 PropertyName 결정

    <TreeView ItemsSource="{Binding PrimitiveNodes}"> 
        <TreeView.ItemContainerStyle> 
         <Style TargetType="{x:Type TreeViewItem}"> 
          <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/> 
          <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/> 
          <Setter Property="FontWeight" Value="Normal" /> 
          <Style.Triggers> 
           <Trigger Property="IsSelected" Value="True"> 
            <Setter Property="FontWeight" Value="Bold" /> 
           </Trigger> 
          </Style.Triggers> 
         </Style> 
        </TreeView.ItemContainerStyle> 
        <TreeView.ItemTemplate> 
         <HierarchicalDataTemplate ItemsSource="{Binding PrimitiveNodes}"> 
           <TextBlock PreviewMouseLeftButtonDown="TextBlock_PreviewMouseLeftButtonDown" ContextMenu="{StaticResource TreeViewItemContextMenu}" PreviewMouseRightButtonDown="TextBlock_PreviewMouseRightButtonDown" 
              Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
         </HierarchicalDataTemplate> 
        </TreeView.ItemTemplate> 
       </TreeView> 

그리고 여기는 Text 속성에 사용하는 코드입니다.

// Called out in the Name property when it is set 
this.OnPropertyChanged(System.Windows.Controls.TextBlock.TextProperty.Name); 

여기 뒤에있는 코드에서 변경 될 때

public void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

모두 에 isSelected으로 IsExpanded를 올바르게 업데이트 OnPropertyChanged를 기능을합니다. 그러나 텍스트 속성은 그렇지 않습니다. 나는 에이 이름 속성을 업데이트 할 때 (따라서 업데이트 할 모든 속성을 강제)하고는 TextBlock의텍스트 속성을 올바르게 새 값으로 업데이트하고, 잘 작동을 OnPropertyChanged를 통과했습니다. 그래서 어쩌면 내가 TextBlock의텍스트 속성의 propertyName 형식로 잘못된 문자열을 전달하고있어이 업데이트 될 때 의심,하지만 난 올바른 속성 이름이 있어야 할 모르겠어요 또는 어떻게 것 그것을 알아내는 것. 어떤 아이디어?

감사합니다, 크레이그

당신은 Name 재산에하여 PropertyChanged 이벤트를 발생함으로써

this.OnPropertyChanged("Name"); 

Name라고 변경지고 속성의 이름 때문에, 그것을 "Name"을 통과해야

+2

"Name"속성이 변경되면 PropertyChangedEventArg의 propertyName은 ...이어야합니다. ... "Name":-) 속성을 바인딩 할 수있는 곳을 '잊어 버리는'것이 Binding의 목적입니다. – GameAlchemist

답변

1

, 당신 속성이 변경되었다는 것을 WPF에 알리면 해당 속성을 사용하는 바인딩이 업데이트됩니다.

INotifyPropertyChanged은 UI 개체가 아니라 데이터 모델에서 사용하기위한 것입니다. 이상적으로는 UI 컨트롤을 참조해서는 안됩니다.

IsExpandedIsSelected이 속성 이름을 사용하는 이유는 UI 개체와 데이터 개체 모두에서 속성 이름이 동일하기 때문입니다. 이것은 PropertyChanged 알림을 발생시키는 끔찍한 방법입니다. 따라서 UI 객체의 속성 이름이 아닌 실제 속성 이름을 전달하는 것으로 전환하는 것이 좋습니다.

+0

Gah 내가 바보 야, 고마워 .-) – Craig

+0

시간이 있다면 제안이 어떻게 구현 될지에 대한 작은 예제를 제공해 주시겠습니까? 아니면 내가 읽을 수있는 좋은 링크를 아는가? 다시 한번 감사드립니다. – Craig

+0

@Craig'IsSelected'와'IsExpanded' 속성 변경 알림을 의미합니까? 이것은'Name'과 동일하지만, 문자열을 어떤 속성 이름이 변경된 것으로 바꾸십시오. 'this.OnPropertyChanged ("IsSelected");'[INotifyPropertyChanged'에 대한 MSDN 사이트]에서 예제를 볼 수 있습니다 (http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx) – Rachel

관련 문제