2012-07-19 4 views
1

"Renderer"라는 단일 Dependendency 속성을 정의하는 종속성 개체가 있습니다.DependencyObject와 INotifyPropertyChanged를 모두 구현합니다.

<local: CellInfo x:key="cellInfo" /> 

및 I 등으로 결합 더 아래 :

XAML에서
public class Renderer { 
    public string ResourceKey{get; set;} 
    public string[] Params{get; set;} 
} 

public class CellInfo : DependencyObject { 
    public static readonly DependencyProperty RendererProperty= 
    DependencyProperty.Register("Renderer", typeof(Renderer), typeof(CellInfo), null); 

    public Renderer Renderer { 
    get { return (Renderer)GetValue(RendererProperty); } 
    set { SetValue(RendererProperty, value); } 
    } 

    public void UpdateRenderer(string resourceKey, params string[] parameters) { 
    this.Renderer.ResourceKey = resourceKey; 
    this.Renderer.Params = parameters; 
    //force refresh - this does not work 
    Renderer tmp = this.Renderer; 
    this.Renderer = null; 
    this.Renderer = tmp; 
    } 
} 

I는 다음과 같이 그것의 선언있어 상기 컨트롤 템플릿은 디스플레이로 사용

<ControlTemplate x:Key="MyDisplayTemplate" > 
    <TextBlock VerticalAlignment="Center" HorizontalAlignment="Stretch" > 
    <TextBlock.Text> 
    <MultiBinding Converter="{StaticResource MyConverter}" > 
     <Binding Path="Value" /> 
     <Binding Source="{StaticResource cellInfo}" Path="Renderer"/> 
    </MultiBinding> 
    </TextBlock.Text> 
    </TextBlock> 
</ControlTemplate> 

그리드의 셀 템플릿. 내가 그것을 이해하고 INotifyPropertyChanged 을 구현하는 것보다 성능 및 메모리 리소스 에지를 가지고 있기 때문에 성능상의 이유로 여기에 의존성 객체/속성을 사용하고 싶다.

내가 겪고있는 문제는 렌더러 객체의 데이터가 변경 될 때 셀에 대한 트리거를 업데이트하는 것입니다. 코드에서 먼저 값을 null로 설정 한 다음 값을 원래 속성 값으로 다시 설정하여 값이 동일하면 종속성 속성이 업데이트를 트리거하지 않는다는 사실을 알아 내려고 시도합니다. 이것은 작동하지 않습니다.

내가 작업 할 수 있었던 유일한 점은 객체가 INotifyPropertyChanged을 구현하고 CellInfo.Renderer setter에 PropertyChanged 이벤트를 발생시키는 것입니다.

내 생각에 INotifyPropertyChange을 구현하면 DependencyObjects만을 사용하면 성능상의 이점이 없어집니다. 맞습니까? 이 시점에서, 만약 내가 INotifyPropertyChanged을 구현하도록 강요한다면, 심지어 DependencyObject을 확장 할 수 없을까?

입력 해 주셔서 감사합니다.

+0

'클래스 렌더러'가 불변으로 만들어지면 훨씬 쉬워 질 것입니다. –

+0

왜? 올바른 가정 (마지막 단락 참조) – mike01010

+1

변경할 수없는 값을 한 번에 모두 바꿔야하고 알림을 실행합니다. –

답변

1

기존 인스턴스를 수정하는 대신 Renderer의 인스턴스를 스왑 아웃하거나 (따라서 불변으로 만들 수 있음) DependencyObject까지 확장하고 종속성 속성을 공개하십시오.

WPF가 속성을 null로 볼 기회를 얻지 못하기 때문에 속성을 null로 설정하고 다시 설정하는 것이 효과적이지 않은 이유는 때문입니다. 코드가 발송자 메시지로 실행되고 바인딩 업데이트가 별도의 메시지로 발생합니다. 그 메시지는 네가 끝날 때까지는 실행되지 않으므로 결코 변화를 볼 수 없다. 한 메시지에서 null로 업데이트 한 다음 다른 메시지에서 다시 설정하는 해결 방법이 있습니다. 그러나 그런 다음 모든 성능 향상을 창안 밖으로 던지고 있습니다. "올바른"방법을 사용하는 것은 말할 것도없이 어쨌든 훨씬 쉬워졌습니다.

+0

감사합니다, INotifyPropertyChanged 구현 문제를 해결할 ...하지만 그것에 대해 올바른 가정 할 것이라고 .. 그게 아니라면 내가 DependencyObject를 확장하지 않을 수도 있습니다 아무 지점도 (즉 성능 향상을 사용하여 DependencyObject는 INotifyPropertyChange를 구현해야 함으로 창 외부에 던져 질 수 있습니까? – mike01010

+0

@mike : 그것은 하나 또는 다른 것입니다. DependencyObject를 확장하면 바인딩 업데이트 측면에서 약간의 성능 향상을 제공합니다. 그러나 WPF 인프라에 연결하고 다른 클래스를 상속받지 못하기 때문에 절충됩니다. –

관련 문제