codememo

종속성 속성 SetValue()와 SetCurrentValue()의 차이점은 무엇입니까?

tipmemo 2023. 4. 13. 20:52
반응형

종속성 속성 SetValue()와 SetCurrentValue()의 차이점은 무엇입니까?

질문을 하는 이유는 (이 질문에서) @Greg D로부터 사용을 추천받았기 때문입니다.SetCurrentValue() 않고뜻일까요?또는 "값 소스를 변경하지 않고"란 무엇을 의미합니까?

SetValue()

종속성 속성 ID로 지정된 종속성 속성의 로컬 값을 설정합니다.

SetCurrentValue()

값 소스를 변경하지 않고 종속성 속성의 값을 설정합니다.

지정한 MSDN 링크에서는 다음과 같이 표시됩니다.

이 메서드는 응용 프로그램이 선언한 속성 사용을 사용하지 않도록 설정하지 않고 자체 속성 중 하나의 값을 프로그래밍 방식으로 설정하는 구성 요소에 의해 사용됩니다.SetCurrentValue 메서드는 속성의 유효값을 변경하지만 기존 트리거, 데이터 바인딩 및 스타일은 계속 작동합니다.

를 들어, 여러분이 글을 해 봅시다.TextBox에 의해, 「Disclosed」가 되어 있습니다.Text다음과 같이 합니다.

<TextBox Text="{Binding SomeProperty}"/>

의 코드로, 「」를 하면, 「」가 .SetValue제공된 모든 것으로 바인딩을 덮어씁니다.전화하시면SetCurrentValue단, 속성은 지정된 값을 차지하지만 바인딩은 파괴되지 않습니다.

내가 아는 한, 그렉의 충고는 틀렸다. 써야 요.GetValue/SetValueCLR을 사용합니다. SetCurrentValue는 지정된 값을 취할 속성이 필요하지만 속성에 대해 구성된 바인딩, 트리거 또는 스타일을 덮어쓰지 않는 시나리오에서 더 유용합니다.

데모 하니스(전체):

class test : DependencyObject
{
    static DependencyProperty XyzProperty =
        DependencyProperty.Register("Xyz", typeof(int), typeof(test), new PropertyMetadata(42));

    public test()
    {
        /* ... see code shown below ... */
    }

    void inf()
    {
        var info = DependencyPropertyHelper.GetValueSource(this, XyzProperty);
        var msg = $@"{"//"
                   } {(int)GetValue(XyzProperty),2
                   } {(ReadLocalValue(XyzProperty) is int x ? "(Object)" + x : "UnsetValue"),12
                   } {info.BaseValueSource,9
                   } {(info.IsCurrent ? "" : "Not") + "Current",12
                   } {(info.IsCoerced ? "" : "Not") + "Coerced",12
                   }";
        Trace.WriteLine(msg);
    }
};

토론 예:

                                      // v̲a̲l̲u̲e̲  s̲t̲o̲r̲e̲d̲-o̲b̲j̲      B̲V̲S̲    C̲u̲r̲r̲e̲n̲t̲?    C̲o̲e̲r̲c̲e̲d̲?
/*1*/                                    // 42  UnsetValue  Default  NotCurrent  NotCoerced

/*2*/ SetValue(XyzProperty, 5);          //  5   (Object)5    Local  NotCurrent  NotCoerced

/*3*/ SetValue(XyzProperty, 42);         // 42  (Object)42    Local  NotCurrent  NotCoerced

/*4*/ ClearValue(XyzProperty);           // 42  UnsetValue  Default  NotCurrent  NotCoerced

/*5*/ SetCurrentValue(XyzProperty, 5);   //  5   (Object)5  Default     Current     Coerced

/*6*/ SetCurrentValue(XyzProperty, 42);  // 42  UnsetValue  Default  NotCurrent  NotCoerced

/*7*/ SetValue(XyzProperty, 5);          //  5   (Object)5    Local  NotCurrent  NotCoerced
      SetCurrentValue(XyzProperty, 42);  // 42  (Object)42    Local     Current     Coerced

토론:

  1. DependencyPropertyDefaultValue는 '42'를 BaseValueSource.Default이치노 ReadLocalValue() 'Singleton'을 합니다.DependencyProperty.UnsetValue.

  2. SetValue()BaseValueSource.Local기대한 대로의 값

  3. 「」를 사용합니다.SetValue DefaultValue.BaseValueSource.Defaultstate (#6 )

  4. 값 DP를 하십시오.ClearValue() (주 ). ( 래주 ( ( )

  5. ★★★★★★★★★★★★★★★★ SetCurrentValue()는 강요에 되며, 를하지 않고 '강요'를 통해 생성됩니다.BaseValueSource.Local 하십시오. 앞의 것은BaseValueSource 속성이 현재 실제로 동일한 값이 아닌 을 보고함에도 불구하고 기본값이 여전히 우세합니다.DefaultValue.

중요:
즉, 체크하는 것은BaseValueSource에 의해 반환되었다GetValueSource()상태는BaseValueSource.Default는 일반적인 속성 값이 DP 메타데이터의 기본값과 동일한지 여부를 나타내는 신뢰할 수 있는 지표가 아닙니다.

  1. 반면에, 위의 3번과 달리...SetCurrentValue DP 메타데이터와 동등성을 체크합니다.DefaultValue따라서 값을 제거하기 위해 "중복"으로 간주됩니다.이 적극적인 청소는 DP 스토리지의 팽창을 완화하기 위해 설계될 수도 있지만, DP 상태의 투명성을 복잡하게 하는 특수한 "마스크 해제" 동작으로 인해 완전히 이해하지 못할 경우 불분명한 버그가 발생할 수 있습니다.예를 들어 #6은 DP를 클리어하여 식별 불가능한 상태로 되돌립니다.ClearValue()

  2. ...다만, 이전에 보존된 것이BaseValueSourceCurrent andLocal; #5/#6은 #7입니다.이 쌍에서는 동일한 속성 값이 보고되지만 내부 상태 플래그가 상당히 다릅니다.

에 대해서ClearValue():

명한 it PropertyChangedCallback는 어떤 경우에도 .SetValue()결과적으로 속성의 이전 값에서 변경되지 않는 작업입니다.그게 중요한 이유는SetValue에는 지속적인 변경이 작업 중인 활성 자산의 가치와 관련이 있다는 암묵적인 가정이 포함되어 있습니다. 것은 된다는 입니다.ClearValue()뿐만 아니라.

를 들어 '4'라고 합니다.ClearValue value " " " " " " "42내부 DP 스토리지에서 삭제되는 것 외에 다른 내부 상태 변경도 모두 예상대로 이루어집니다.는 ( 하지 않느냐는 이다.OnPropertyChanged현재 콜 중에 호출되는 것은 이전 값이 메타데이터 기본값과 일치하는지 여부에 따라 달라집니다.

clear에서는, 「clear」의 이, 「」의 이전 폐기를 것 때문에, 「clear」의 이 「의할 수 .ClearValue()이전 상태에 따라 달라집니다.특히 "변경" 알림을 실행할지 여부 등 새로운 상태를 수반(및 혼합)하는 중요한 동작의 경우입니다.

승인된 답변에 더하여 주십시오.

투고는 SetCurrentValue()에 대해 매우 잘 설명하고 있습니다.Dependency Property Value Precedence 시스템이 바인드된 값보다 로컬 값을 취하는 방법에 유의하십시오.그래서 논객들의 예상치 못한 행동이 설명된다.

언급URL : https://stackoverflow.com/questions/4230698/whats-the-difference-between-dependency-property-setvalue-setcurrentvalue

반응형