gpt4 book ai didi

c# - Resharper 说 OnPropertyChange set member can be private while not true

转载 作者:行者123 更新时间:2023-11-30 13:20:14 24 4
gpt4 key购买 nike

我使用 C#、MVVM、WPF 和 Resharper。

使用以下代码时:

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

我收到 Resharper 的警告:将设置访问器设为私有(private)。

将 set 方法设为私有(private)时,我收到 InvalidOperationException:TwoWay 或 OneWayToSource 绑定(bind)无法在类型为“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}"/>

对于绑定(bind)到 IsChecked(上面代码中的 ProgramBanksSelected 和 CombiBanksSelected)的两个(和更多)属性,我有 Resharper 问题。

在答案中显示我应该使用 DataTemplate,但我仍然无法弄清楚究竟如何(不使用 MVVM light 的定位器)。

我应该如何使用数据上下文/模板?

最佳答案

Resharper 没有足够的信息来推断正在使用 setter。例如:

这段代码:

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);
}
}
}

使用此 Xaml:

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

将显示 setter 未被使用(当 SWA 打开时)。

但是,如果您将 Xaml(添加 DataType="{x:Type Samples:ViewModel}")更改为:

<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 Light 的 View 定位器:

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

使用 d:DataContext。我建议看这个 MSDN walkthrough

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

显式设置 DataContext

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

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

等...

任何这些方法都允许 R# 和 VS 推断类型的使用并提供智能感知。

关于c# - Resharper 说 OnPropertyChange set member can be private while not true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9549168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com