在我的工作地点,我们最近将我们的代码库从.Net 3.5升级到.Net 4(C#).遇到的大多数问题都已经解决了,但是我无法弄明白.我们通过混合使用xaml和代码来初始化控件和页面(基于开发人员首选项),但是一个页面在打开时会抛出NullReferenceException.这是一段代码片段(许多控件之一)抛出.
抛出异常的所有代码都在DataTemplate中(我认为这可能是相关的)
<TextBox x:Name="Values" Grid.Column="1" Grid.Row="0" Margin="5,2,5,2"
Text="{Binding ElementName=Descriptions, Path=SelectedValue, UpdateSourceTrigger=PropertyChanged,
Mode=TwoWay,
Converter={StaticResource EmptyConverter}}"
GotFocus="Column_GotFocus"
MinWidth="100"
CharacterCasing="Upper"
Visibility="{Binding Path=IsValueVisible, Converter={StaticResource VisibilityConverter}}"
/>
Run Code Online (Sandbox Code Playgroud)
现在,投掷线是:
GotFocus="Column_GotFocus"
Run Code Online (Sandbox Code Playgroud)
Column_GotFocus位于代码隐藏文件中.还有一些事实:我们在迁移之前没有遇到任何问题,异常会连续抛出,并且有三个不同的事件导致了这个问题.
投掷的三个事件是:
GotFocus="Column_GotFocus"
SelectionChanged="Descriptions_SelectionChanged"
Click="Search_Click"
Run Code Online (Sandbox Code Playgroud)
删除这些完全解决了我们的问题,但显然会导致软件出现功能问题.有谁知道可能导致这些问题的原因是什么?
编辑:
很抱歉,澄清一下:永远不会调用事件处理程序,xaml事件处理程序添加(例如GotFocus ="Column_GotFocus")似乎是抛出异常的地方.
例外是:
System.NullReferenceException occurred
Message=Object reference not set to an instance of an object.
Source= <assembly/namespace>
StackTrace:
at <assembly/namespace>.<Class>.System.Windows.Markup.IStyleConnector.Connect(Int32 connectionId, Object target) in <XamlFilePath>:line 291
InnerException:
Run Code Online (Sandbox Code Playgroud)
编辑2:
方法处理程序是:
private void Column_GotFocus(object sender, RoutedEventArgs e)
{
ContentPresenter columnContentPresenter =(DependencyObject)sender).FindParent<ContentPresenter>();
Column column = …
Run Code Online (Sandbox Code Playgroud) VS 2012中的代码分析工具提出了我的代码的一些问题.大多数都很好,这一个(CA1009正确声明事件处理程序)然而我无法理解其推理.
如果我不需要任何数据,只是为了知道发生了什么事情,在我看来,我通过使用不需要参数的事件来模糊我的真实意图.
例如,假设我要列出符合给定条件的所有客户.如果我的存储库已更新,我需要重新检查数据.
所以我创建了一个存储库类,然后给它一个带有以下签名的DataChanged事件:
public event Action DataChanged;
Run Code Online (Sandbox Code Playgroud)
然后在其中一个使用repo的类中,我可以做
repository.DataChanged += UpdateMatchingCustomers;
private void UpdateMatchingCustomers() {
MatchingCustomers = ...
}
Run Code Online (Sandbox Code Playgroud)
为什么这是一个坏主意?
可以说我在C#中有以下代码
var stringList = GetListOfStrings();
var firstString = stringList.Where(s => true)
.Where(s => true)
.Where(s => true)
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
它没有做太多,但它的格式是我喜欢的ReSharper和Resharpers Code Cleanup功能.
现在让我说我重写该代码只是调用方法GetListOfStrings
而不首先将它分配给变量.在这种情况下,Resharper将其格式化如下:
var firstString = GetListOfStrings()
.Where(s => true)
.Where(s => true)
.Where(s => true)
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
有没有改变这个,所以ReSharper将其格式化为如下?
var firstString = GetListOfStrings().Where(s => true)
.Where(s => true)
.Where(s => true)
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
如果它有任何区别,我正在使用ReSharper 8 Beta和VS 2013预览版.
我想在我的 VM 上安装 azure 代理,并将其显示为环境资源,如下所述:https://learn.microsoft.com/en-us/azure/devops/pipelines/process/environments-virtual-machines?视图=azure-devops。
如果您以交互方式运行脚本,那么这是有效的,但是当我使用时--unattended
(如下所述: https: //learn.microsoft.com/en-us/azure/devops/pipelines/agents/v2-windows ?view=azure-devops# unattended-config)不再有指定标签的方法。该--addDeploymentGroupTags
选项不适用于环境代理。
如何使用标签自动添加虚拟机作为环境资源?