2013-04-09 7 views
1

이것은 쉬운 것이어야하지만 알아낼 수는 없습니다. 내 맞춤 활동의 일부 속성이 변경되면 (예 : WF 디자이너의 속성 표에서 속성을 변경하여) DisplayName을 동적으로 업데이트하려고합니다. 나는 속성 정의 코드에서 이것을한다 :코드에서 DisplayName을 업데이트해도 디자이너에 표시되지 않습니까?

액티비티는 INotifyPropertyChanged를 구현한다. 그러나 DisplayName은 디자이너 화면에서 변경되지 않습니다. 내가 뭘 놓치고 있니?


답변은 맞습니다. 디자이너 (* .xaml.cs)의 업데이트 된 코드를 여기에 별도의 대답으로 붙이겠습니다. 올바른 형식 (주석으로 사용 가능하지 않음)이 있어야합니다. 이 코드는 copmpiles하고 트릭을 않습니다.

protected override void OnModelItemChanged(object newItem) 
    { 
     ModelItem modelItem = newItem as ModelItem; 
     if (modelItem != null) 
      modelItem.PropertyChanged += this.ModelItemPropertyChangedHandler; 
     base.OnModelItemChanged(newItem); 
    } 

    private void ModelItemPropertyChangedHandler(object sender, PropertyChangedEventArgs e) 
    { 
     if (!e.PropertyName.Equals("Type", StringComparison.OrdinalIgnoreCase)) 
      return; 
     ModelItem.Properties["DisplayName"].SetValue("<" + ModelItem.Properties["Type"].Value +">"); 
    } 

이 모티프테이 활동을 랩핑하여도 해결책이 명확하지는 않습니까? 그렇습니다. 무슨 일이 일어나는지보기가 약간 어렵지만 실제로 작동합니다. 잘 했어, 윌!

+1

ModelItem에 대한 자세한 내용은 다음 블로그 게시물을 참조하십시오. http://blogs.msdn.com/b/mwinkle/archive/2009/10/28/deep-dive-into-the-designer-data-model- modelitem-and-modelproperty.aspx 처음에는 비트 뮤치이지만 WF 디자이너에서 작업 할 때 더 명확 해집니다. – Will

+0

@ 위 : 그레이트 블로그 포스트, 포인터 주셔서 감사합니다. 내가 그가 쓰는 모든 것을 이해하는 주에있을 때의 경이로운 생각 ... :) – Achim

답변

2

Activity모두 활동과 디자인 화면 간의 알림 서비스를 처리하는 ModelItem으로 래핑됩니다.

처음 디자이너 내에서 포장

ModelItem하지, 그것은 몇 가지 속성 변경 통지 방법을 제공하는 경우 (INPC, 사용자 정의 TypeDescriptor 등) 또는 다른 인터페이스 (즉, IDataErrorInfo를 확인하기 위해 Activity을 검사 수행하는 I 연결이 here 인 경우).

본질적으로 여기서 수행하려는 작업을 수행 할 수 없습니다. 액티비티 내에서 래핑하는 ModelItem을 통해 변경 알림을 다시 보낼 수 없습니다. 어쨌든, 정말로해서는 안되는 일. 디자이너에서

, 상태 변경해야 ModelItem 통해서만 패스가 래핑 Activity와 동기화 상태를 유지해야한다. 상태와 래핑 된 인스턴스의 상태가 잘못 정렬되면 디자이너에 올바른 정보가 표시되지 않습니다.

// we're doing this in the designer 
var activity = ModelItem.GetCurrentValue() as MyActivity; 
activity.DisplayName = "You won't ever see this in the design surface!"; 

대신, 해결책은 무엇 코드는 그래서 ModelItem

// again, in the designer code 
ModelItem.Properties["DisplayName"].Value = "You will see this change!"; 

을 통해 을 변경해야합니다? 유일하게 실질적인 해결책은 에 자신의 상태가 변경 될 때 Activities이 수동이되도록하는 것입니다! 속성 값이 변경되면 이 표시되지 않습니다..

대신이 코드를 디자이너로 이동하십시오!

override OnModelItemChanged(object obj) 
{ 
    // live dangerously! 
    var mi = obj as ModelItem; 
    mi.PropertyChanged += OnPropertyChanged; 
} 

void OnPropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if(!e.PropertyName.Equals("Type", StringComparison.OrdinalIgnoreCase)) 
     return; 
    ModelItem.Properties["DisplayName"].Value = 
     "<" + 
     ModelItem.Properties["Type"].GetCurrentValue().ToString() + 
     ">"; 
} 

물론이 기능을 copypaste 할 수는 없습니다. 그리고 몇 가지 버그가있을 수 있습니다. 그러나 그것은 당신에게 당신이해야 할 일을 알려줍니다.