- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个简单的 WPF 应用程序。目前,该应用程序仅管理 ComboBox 中的视频游戏列表。游戏列表与 XML 文件进行序列化。
当前被破坏的功能是能够从 ComboBox 中选择一个游戏,这使其成为要管理的“事件”游戏。事件游戏将存储为应用程序设置。为此,我使用双向数据绑定(bind)并将 ComboBox 中的 SelectedItem 绑定(bind)到 ViewModel 中的 SelectedGame。
当我运行应用程序并从 ComboBox 中选择一个项目时,我在 Game.Equals(Game other) 方法上得到一个空引用异常。在调试时,我看到 DependencyProperty.UnsetValue 作为参数传递给重写的 Game.Equals(object obj) 方法,这会导致 obj as Game
使 obj 为空。
我不明白为什么当我所做的只是从 ComboBox 值中选择一个项目时,为什么首先调用 Equals,所以我猜它是 WPF 原生的东西。在前往 Equals 方法之前,该代码似乎没有遇到任何其他断点,因此我什至不确定如何调试该问题。我也不明白 DependencyProperty.UnsetValue 来自哪里。我在这里完全迷失了,并希望有任何见解,包括如何进一步调试。
编辑:正如 Glen 所暗示的,Equals 必须由 WPF 的某些底层组件调用。至少目前,我的解决方案是简单地在我的 Equals 覆盖中添加一个空检查。
型号类
public class Game : IEntity, IEquatable<Game>
{
[XmlElement("Name")]
public string Name { get; set; }
[XmlElement("ExecutablePath")]
public string ExecutablePath { get; set; }
public Game(string name, string executablePath)
{
Name = name;
ExecutablePath = executablePath;
}
private Game() { } // Required for XML serialization.
public bool Equals(Game other)
{
return Name.EqualsIgnoreCase(other.Name);
}
public override bool Equals(object obj)
{
return Equals(obj as Game);
}
}
public class GamesViewModel
{
// The GameRepository retrieves the game collection from the XML file.
private readonly GameRepository _gameRepository;
public ObservableCollection<Game> Games
{
get { return new ObservableCollection<Game>(_gameRepository.Items); }
}
public Game SelectedGame
{
get { return Settings.Default.ActiveGame; }
set
{
if (!Settings.Default.ActiveGame.Equals(value))
{
Settings.Default.ActiveGame = value;
Settings.Default.Save();
}
}
}
public GamesViewModel()
{
_gameRepository = RepositorySingletons.GameRepository;
}
}
<UserControl x:Class="ENBOrganizer.UI.Views.GamesView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ENBOrganizer.UI.ViewModels"
mc:Ignorable="d" >
<UserControl.DataContext>
<local:GamesViewModel />
</UserControl.DataContext>
<Grid>
<ComboBox Name="GamesComboBox" ItemsSource="{Binding Games}" SelectedItem="{Binding SelectedGame}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" VerticalAlignment="Center" Padding="5,0,0,0" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
</UserControl>
最佳答案
当SelectedItem
您的 ComboBox
的更改从 View 中,您会发现您的源属性 (SelectedGame
) 可能会被设置两次,一次的值为 null
(因为不再选择上一个项目),然后为新选择的项目一次。
如果您的代码依赖于不为 null 的对象,则通常处理的方式是使用简单的 null 值检查:
if (value != null)
{
// Code that relies on value not being null
}
关于c# - 为什么 DependencyProperty.UnsetValue 被传递到 Equals(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32490142/
我正在开发一个简单的 WPF 应用程序。目前,该应用程序仅管理 ComboBox 中的视频游戏列表。游戏列表与 XML 文件进行序列化。 当前被破坏的功能是能够从 ComboBox 中选择一个游戏,这
我创建了一个简单的转换器来连接我的 WPF 应用程序中四个文本框的文本。 这是转换器: public class FourString:IMultiValueConverter { publ
我有一个非常简单的 IMultiValueConverter,它只对两个值进行或运算。在下面的示例中,我想使用同样简单的 bool 反相器来反转第一个值。 和逆变器: publ
我的代码在启动时失败,因为 Multibinding 调用的 Converter 中的值数组 未填充正确的值,但值为 DependencyProperty.UnsetValue。 看看 Convert
我有一个自定义登录用户控件,它有一个普通的文本框和一个密码框。 Blend 拒绝与 PasswordBox 合作,称“DP.UnsetValue”对于 PasswordChar 属性无效。然而,该项目
我有以下多重绑定(bind): MyVisibilityDependencyProperty 是一个依赖属性。 MyBoolProperty 是一个
我是一名优秀的程序员,十分优秀!