2012-03-03 2 views
3

저는 C#, MVVM, WPF 및 Resharper를 사용합니다. Resharper가 OnPropertyChange 집합 멤버가 비공개 일 수 있다고 말합니다.

하면 다음과 같은 코드를 사용하는 경우 : 설정 접근은 비공개 :

public bool CombiBanksSelected 
    { 
     get { return _selectedBanksType == ESelectedBanksType.CombiBanks; } 
     set 
     { 

나는 ReSharper에서의 경고를 얻을.

set 메서드를 private로 설정하면 InvalidOperationException이 발생합니다. TwoWay 또는 OneWayToSource 바인딩은 ''PcgTools.ViewModels.PcgViewModel ''형식의 읽기 전용 속성 ''CombiBanksSelected ''에서 작동하지 않습니다.

public bool CombiBanksSelected 
    { 
     get { return _selectedBanksType == ESelectedBanksType.CombiBanks; } 
// ReSharper disable MemberCanBePrivate.Global 
     set 
// ReSharper restore MemberCanBePrivate.Global 
     { 

을하지만이 좋은 느낌 좋은 찾고되지되지 않습니다

물론 나는 추가하여 억제 할 수 있습니다. 이 문제에 대한 더 나은 대안이나 해결책이 있습니까?

답변에 따르면 XAML 코드를 변경해야합니다. 광산은 다음과 같습니다

<UserControl x:Class="PcgTools.PcgWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ViewModels="clr-namespace:PcgTools.ViewModels" Height="Auto" Width="Auto" 
    Loaded="Window_Loaded"> 

<Grid> 
    ... 
    <RadioButton Content="_Programs" Height="16" HorizontalAlignment="Left" Margin="12,12,0,0" Name="radioButtonPrograms" VerticalAlignment="Top" 
       IsChecked="{Binding Path=ProgramBanksSelected}" IsEnabled="{Binding Path=ProgramsEnabled}"/> 
    <RadioButton Content="_Combis" Height="16" HorizontalAlignment="Left" Margin="85,12,0,0" Name="radioButtonCombis" VerticalAlignment="Top" 
       IsChecked="{Binding Path=CombiBanksSelected}" IsEnabled="{Binding Path=CombisEnabled}"/> 

내가 모두 (등)에 대한 ReSharper에서 문제 (위의 코드에 ProgramBanksSelected 및 CombiBanksSelected)의 IsChecked에 바인더 제본 특성을 가지고있다.

대답은 내가 DataTemplate을 사용해야한다는 것을 보여 주지만, MVARCH light의 Locator를 사용하지 않고서도 정확히 정확히 알 수는 없습니다.

데이터 컨텍스트/템플릿은 어떻게 사용해야합니까?

+0

음, 아마도 ReSharper에서이 경우 단지 잘못? – Vlad

+0

네,하지만 약 20 개 위치에있는 모든 경우에 발생합니다. 그리고 모든 해제 비고를 추가하여 코드를 망칠 필요가 없습니다. –

+1

@MichelKeijzers : 그 속성 인'CombiBlankSelected'는'readonly'처럼 실제로 사용됩니다. 그렇지 않습니까? – Tigran

답변

3

Phil의 훌륭한 제안 외에도 UsedImplicitlyAttribute를 사용할 수도 있습니다. 당신은 당신이

enter image description here

의 DLL을 추가 Nuget를 수행하는 데 사용할 수있는 그리고 R 번호 자체는 속성과 세터 장식을 제공합니다 :

public bool CombiBanksSelected 
{ 
    get { return _selectedBanksType == ESelectedBanksType.CombiBanks; } 
    [UsedImplicitly] set 
    { 

내가 코멘트보다는 덜 시끄러운 찾기 , 데이터 바인딩이 일반적으로 R #에 알려지지 않은 ViewModel에 잘 맞습니다. (때로는 실제로 R #을 닫으려는 이유를 생각 나게하기 위해 주석을 선호하지만,이 경우에는 그렇지 않습니다.)

건배,
Berryl

+0

고마워,이게 내가 원하는거야 .Btw, 링크 http://www.jetbrains.com/resharper/webhelp/Code_Analysis__External_Annotations.html에 나와 있습니다. –

+1

기본적으로 R #을 조용히하고 사라지게하려면 좋겠지 만 R #의 이점을 잃어 버리는 경우 xaml에서 R # 충분한 정보를 얻으면 모든 R # 당신의 xaml에서의 선량 - 리팩토링, 인텔리 센스, goto 선언 등의 이름 바꾸기. – Phil

+0

@Phil 네, 맞습니다. 당신의 솔루션이 최상이기 때문에 앞으로 할 일에 그것을 추가 할 것입니다. 지금). –

9

Resharper에는 setter 사용 중 추측 할만한 정보가 충분하지 않습니다. 예 :

이 코드는이 XAML와

public partial class Page2 
{ 
    public Page2() 
    { 
     InitializeComponent(); 

     DataContext = new List<ViewModel> 
          { 
           new ViewModel() 
          }; 
    } 
} 

public class ViewModel : ViewModelBase 
{ 
    private bool _combiBanksSelected; 
    public bool CombiBanksSelected 
    { 
     get { return _combiBanksSelected; } 
     set 
     { 
      Set(()=>CombiBanksSelected, ref _combiBanksSelected, value); 
     } 
    } 
} 

: 사용하지 (SWA 켤 때)

<Grid> 
    <Grid.Resources> 
     <DataTemplate x:Key="Template" > 
      <CheckBox IsChecked="{Binding CombiBanksSelected}"/> 
     </DataTemplate> 
    </Grid.Resources> 
    <ListBox ItemsSource="{Binding}" ItemTemplate="{StaticResource Template}" /> 
</Grid> 

는 세터를 보여줄 것이다. 에 사용자가 XAML을 변경하는 경우

그러나 ('{: : 유형 샘플 뷰 모델 X} "데이터 형식 = 추가) :

<Grid> 
    <Grid.Resources> 
     <DataTemplate x:Key="Template" DataType="{x:Type Samples:ViewModel}"> 
      <CheckBox IsChecked="{Binding CombiBanksSelected}"/> 
     </DataTemplate> 
    </Grid.Resources> 
    <ListBox ItemsSource="{Binding}" ItemTemplate="{StaticResource Template}" /> 
</Grid> 

R 번호 지금 충분한 정보를 가지고 있으며, 경고를 표시하지 않습니다.

물론 R # 및 VS Intellisense에 사용중인 유형에 대한 자세한 힌트를 제공하는 다른 방법이 있습니다. 예는 다음과 같습니다

은 MVVM 빛의 뷰 로케이터를 사용 : D를 사용하여

<UserControl ... 
    DataContext="{Binding AViewModel, Source={StaticResource Locator}}" /> 

: DataContext에. 나는 명시 적으로 DataContext를

<UserControl.Resources> 
    <AViewModel x:Key="theModel/> 
</UserControl.Resources> 

<Grid DataContext="{StaticResource theModel}"> ... 

등 설정이 MSDN walkthrough

<UserControl ... 
    d:DataContext="{d:DesignInstance AViewModel, IsDesignTimeCreatable=true}" 

찾는 것이 좋습니다 ...

이러한 방법을 사용하면 R #과 VS가 유형 사용을 추론하고 인텔리 센스를 제공 할 수 있습니다.

+0

솔루션에 따라 DataTemplate을 어떻게 사용해야합니까? –

+1

몇 가지 예를 추가했습니다. 당신이해야 할 일을 정확하게 알기 위해서는 당신의 xaml을 볼 필요가 있습니다. ItemsControl을 사용하는 경우 ItemTemplate을 DataTemplate으로 이동하고 유형을 제공 할 수 있어야합니다. – Phil

+0

MVVM Light를 사용하지 않지만 답변의 일부분을 사용할 수 있다고 생각합니다.하지만 먼저이를 통합하려고합니다. –

2

resharper는 훌륭한 도구이지만 가끔 잘못 될 수 있습니다.

소스 코드에 주석을 달아서 재구성해서는 안됩니다. 또는 그 문제에 대한 다른 도구. 도구가 잘못되었으므로 코드를 수정하지 말고 도구를 수정하십시오.

그래서 resharper에게 무시하십시오. 왼쪽 여백에있는 아이콘을 마우스 오른쪽 버튼으로 클릭하고 앞으로 이런 종류의 문제를 무시하거나 힌트 범주에 넣으라고 지시하십시오. 적용 할 경우 여전히 해결책을 얻을 수 있기 때문에 나는 그 옵션을 좋아하지만 r #은 오른쪽의 그래픽 요약에 표시하지 않습니다.

+0

예, 저는 지금 당장 그랬습니다. 그러나 코드에 약간의 속성이 있다는 메시지를 좋아합니다. R # 경고의 모든 비활성화/활성화와 함께 어수선한. –

관련 문제