programing

CustomBinding MarkupExtension의 Resharper 해결 경로를 만드는 방법

i4 2023. 4. 21. 20:13
반응형

CustomBinding MarkupExtension의 Resharper 해결 경로를 만드는 방법

일반 WPF 바인딩과 동일하게 동작하지만 몇 가지 작업을 수행합니다(다른 기본값을 사용하거나 동작을 추가하는 등).코드는 다음과 같습니다.

public class CustomBindingExtension : Binding
{
  .. some extra properties and maybe overrides ...
}

XAML-intellisense를 포함하여 모두 정상적으로 동작하지만 Resharper가 바인딩 경로를 올바르게 해결할 수 없습니다.예: 이 코드를 사용하면 [Strg]+'현재'를 클릭합니다.Text' 및 Resharper를 사용하면 vs2010에서 CurrentText-Property를 정의하는 코드로 이동할 수 있습니다.

<UserControl x:Name="uc" ...>
  <TextBox Text="{Binding ViewModel.CurrentText, ElementName=uc}" />
</UserControl>

그러나 런타임에 올바르게 동작하는 바인딩을 사용하면 'Current'를 맴돌 때 툴팁을 얻을 수 있습니다.텍스트가 무슨 MS인지 알려준다.내부의.Design.메타데이터.반사TypeNode' 및 [Strg]+ 경유 내비게이션 없음클릭.

<UserControl x:Name="uc" ...>
  <TextBox Text="{util:CustomBinding ViewModel.CurrentText, ElementName=uc}" />
</UserControl>

나는 다음과 같은 것을 시도했다.

  • 바인딩에서 파생되다
  • BindingDecoratorBase에서 파생됩니다.
  • 내 CustomBinding 클래스에 'Extension' 접미사를 생략합니다.
  • Markup-Extension을 별도의 어셈블리에 넣다
  • ConstructorArgumentAttribute 사용
  • 경로 속성에 대해 string 유형 속성 및 PropertyPath 유형 속성
  • Binding Base와 Binding Base의 원래 클래스도 살펴보았지만 코드와의 차이를 찾을 수 없었습니다.여기서 도움이 될 만한 아이디어가 있나요?아니면 단순히 Binding-MarkupExtension의 특수한 처리로 마크업 익스텐션을 사용할 수 없는 것입니까?

    업데이트 16.03.2011: 버그 또는 Resharper 부족일 수도 있습니다.Jetbrains는 이 문제를 조사하고 있습니다.http://youtrack.jetbrains.net/issue/RSRP-230607

    업데이트 10.12.2013: 한편, 이 기능은 정상적으로 동작하고 있는 것 같습니다(R# 7.1.3, 이전 버전에서도 동작하고 있을 가능성이 있습니다).BindingDecoratorBase의 접근방식을 사용하고 있으며, 매우 마음에 듭니다.Markup Extension이 'Binding'으로 끝나는 경우에만 작동할지 모르지만, 내 Markup Extension은 작동하기 때문에 저는 기쁩니다.

    사실 현재 버전의 R#에서는 불가능하며, 안타깝게도 다음 R# 6.1 릴리즈에는 아직 기능이 없습니다.

    이 기능에는 많은 인프라스트럭처 변경이 필요하지만, 델의 리스트에 기재되어 있기 때문에 R#7에 실장될 것으로 예상됩니다.[CustomBindingMarkup]그리고.[BindingPath](용)path컨스트럭터 파라미터 및Path됩니다.

    불편을 드려 죄송합니다.

    올바른 네임스페이스를 사용하여 커스텀 마크업 확장에 액세스해야 합니다.

    <UserControl x:Name="uc" ...
    xmlns:ext="clr-ns:YourProjectNamespace">
      <TextBox Text="{ext:CustomBinding ViewModel.CurrentText, ElementName=uc}" />
    </UserControl>
    

    다음은 커스텀 마크업 확장자 작성에 관한 좋은 기사입니다.

    R#을 속이는 한 가지 방법은 바인딩이라고 명명하는 것입니다.

    public class Binding : MarkupExtension
    {
        public Binding()
        {
        }
    
        public Binding(string path)
        {
            Path = path;
        }
    
        public string Path { get; set; }
    
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return 5;
        }
    }
    

    그러면 R#의 표준 바인딩과 동일하게 동작합니다.

    <TextBlock Text="{custom:Binding SomeProp}" />
    

    언급URL : https://stackoverflow.com/questions/5265281/how-to-make-resharper-resolve-path-for-custombinding-markupextension

    반응형