【发布时间】:2026-01-21 12:25:01
【问题描述】:
我有一个非常奇怪和烦人的问题,我无法理解。解释起来有点困难,请耐心等待。
背景是我有一个有 2 个视图的应用程序,我可以在 2 个视图之间来回切换。这是使用 MVVM 实现的,因此我有一个带有 ContentControl 的主窗口. ContentControl 的内容绑定到 MainViewModel 中的 CurrentViewModel 属性。 切换是通过使用将 CurrentViewModel 设置为我的 2 个不同视图的一个或另一个 ViewModel 的命令绑定。 这 2 个 ViewModel 通过 App.xaml 中的 DataTemplate 定义链接到视图。我相信这是一个相当常见的设置。 (注意,在当前的实现中,我使用 MvvmLight 并且 ViewModel 使用它的 SimpleIOC 进行管理)
问题现在是,如果我在一个视图中有一个 ToggleButton,并为切换/取消切换状态绘制了一些自定义内容(矩形和圆形)。这是使用样式触发器(或 DataTriggers)实现的。直到这里仍然没有问题,但是如果我将 Fill 属性绑定到 ToggleButton 的前景色(参见下面的代码示例),就会发生一些奇怪的事情:
- 切换按钮,切换到第二个视图,切换回来,取消切换按钮 - 绘图未呈现(原因是填充的绑定不起作用),但切换状态的其他内容没有问题
- 一旦未切换的绘图丢失,在此未切换状态下切换到第二个视图然后切换回来 - 未切换状态的绘图奇迹般地返回并且两种状态(切换/未切换)都正确呈现
编辑: 切换回来时出现的错误: System.Windows.Data 错误:4:找不到与引用“ElementName = TB1”绑定的源。绑定表达式:路径=前景;数据项=空;目标元素是'椭圆'(名称='');目标属性是“填充”(输入“画笔”)
有人知道问题出在哪里以及如何解决这个问题吗? 我正在考虑简化测试应用程序,排除所有 MvvmLight / IOC,但我怀疑这个问题与此有关。
<ToggleButton x:Name="TB1" Grid.Row="0" Grid.Column="1" Margin="5" Width="30"
Command="{Binding Toggle1}"
IsChecked="{Binding IsToggled1}">
<ToggleButton.Style>
<Style TargetType="{x:Type ToggleButton}">
<Setter Property="Content" >
<Setter.Value>
<Rectangle Width="17" Height="17" Fill="{Binding ElementName=TB1, Path=Foreground}" />
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding IsToggled1}" Value="False">
<Setter Property="Content">
<Setter.Value>
<Ellipse Width="17" Height="17" Fill="{Binding ElementName=TB1, Path=Foreground}" />
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ToggleButton.Style>
【问题讨论】:
-
您能尝试将RelativeSource 绑定到父ToggleButton 吗?那应该可以。
-
@oddparity 哦,但这就是我第一次写它的方式,只是试图摆弄xaml。但是,我总是遇到同样的问题,所以它一定比那更“深”
-
有趣的是,当我窥探 ToggleButton 时,矩形就在那里。当我在 Snoop 的树中单击它时,它甚至会立即可见。
标签: .net wpf mvvm data-binding