后面代码中的重构属性名不会传播到XAML文件



我试图在以下解决方案中将属性MyText重构为新名称HerText:

MainWindow.xaml.cs

using System.Windows;
namespace resharper_refactoring_xaml
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
MyText = "Blabla";
DataContext = this;
}
public string MyText { get; set; }
}
}

MainWindow.Xaml

<Window x:Class="resharper_refactoring_xaml.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:resharper_refactoring_xaml"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<TextBlock Text="{Binding Path=MyText}"></TextBlock>
</Grid>
</Window>

右键单击属性并选择Refactor this>重命名。然后为属性输入一个新名称,点击Next

不幸的是,只有代码后面的MyText的引用被重命名。在XAML文件中对MyText的引用重命名为完整的

根据这个问题,Resharper应该能够将重构传播到XAML文件。

为什么重命名没有传播到XAML文件?有没有什么我可能忽略了的Resharper设置?

这背后的原因似乎是ReSharper不能确定在XAML标记中指定的属性名指的是在MainWindow类中定义的属性,如果DataContext属性是在代码隐藏中设置的,则。默认情况下,绑定引用控件的DataContext作为源。如果未检测到,则丢失松散标记与定义类型之间的链接。我不知道这是ReSharper的bug还是一般的限制。

然而,对于这个问题,有两个简单的解决方案对我来说很有效:

  1. 将设计时数据上下文设置为定义此处属性的类型MainWindow

    <Window ...
    d:DataContext="{d:DesignInstance Type={x:Type local:MainWindow}}">
    
  2. 在XAML中通过绑定而不是代码隐藏来设置数据上下文。

    <Window ...
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
    

最新更新