我试图在以下解决方案中将属性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还是一般的限制。
然而,对于这个问题,有两个简单的解决方案对我来说很有效:
-
将设计时数据上下文设置为定义此处属性的类型
MainWindow
。<Window ... d:DataContext="{d:DesignInstance Type={x:Type local:MainWindow}}">
-
在XAML中通过绑定而不是代码隐藏来设置数据上下文。
<Window ... DataContext="{Binding RelativeSource={RelativeSource Self}}">