- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
2010年06月12日更新
将精华提炼成较小的 sample - 此处提供解决方案 http://db.tt/v6r45a4
现在看来是与选项卡控件相关的问题:当重新应用数据上下文(单击按钮)时,似乎一切都按预期进行。绑定(bind)会刷新,但事件选项卡上的所有绑定(bind)都会被破坏。
您可以通过选择任何选项卡并单击按钮来验证这一点,您会看到该选项卡上的控件失效。添加了一堆日志记录语句,这就是我的 friend 得出这个概要和他的修复方法的方式 [也在选项卡控件上设置 DataContext="{Binding}"]
但我们仍然不确定为什么会这样......
TabControl Data Context now set to ReproTabItemBug.MainViewModel
TabPage [LeftTabPage] Data Context now set to ReproTabItemBug.LeftViewModel
System.Windows.Data Error: 40 : BindingExpression path error: 'MiddleProp' property not found on 'object' ''MainViewModel' (HashCode=50608417)'. BindingExpression:Path=MiddleProp; DataItem='MainViewModel' (HashCode=50608417); target element is 'TextBox' (Name='MiddleTabTextbox'); target property is 'Text' (type 'String')
TabPage [MiddleTabPage] Data Context now set to ReproTabItemBug.MiddleViewModel
Middle tab textbox text changed to 634272638824920423
TabPage [RightTabPage] Data Context now set to ReproTabItemBug.RightViewModel
Middle tab textbox text changed to
上一篇文章(免责声明:前面有很长的帖子......拿你的爆米花。我已经花了一天的大部分时间......)
我的 ViewModel 由三个 POCO subViewModel 组成。每个 subVieModel 都具有在上述 3 个部分中绑定(bind)的属性。每个 subViewModel 都公开为标准的 .net 只读属性(无 INotifyPropertyChanged)
我的 View 有 3 个部分。每个部分都有一个像这样的 DataContext setter..
...
<TabItem x:Name="_tabPageForVM2" DataContext="{Binding PropReturningSubVM2}">
<!-- followed by UI Items that are data-bound to props inside this sub-viewmodel -->
</TabItem>
...
总结一下
<MainView> <!--DataContext set programmmatically to an Instance Of MainViewModel) -->
<Control DataContext="{Binding PropReturningSubVM1}" >.. Section1 .. </Control>
<Control DataContext="{Binding PropReturningSubVM2}" >.. Section2 .. </Control>
<Control DataContext="{Binding PropReturningSubVM3}" >.. Section3 .. </Control>
</MainView>
现在这是令人费解的一点。在正常启动时,我创建了一个 MainViewModel 实例(将 subview 模型传递给它的构造函数)。监 window 口中的属性证实了这一点。
Trace.WriteLine("Before setting datacontext");
mainView.DataContext = null;
mainView.DataContext = mainViewModel;
//mainView.Refresh();
Trace.WriteLine("After setting datacontext");
一切正常。现在由于我无法控制的原因,出现了 UI 被关闭但 View 仍驻留在内存中的情况。因此,为了在下次显示时清除它,我创建了我的 View 模型的新实例并重新应用数据上下文(通过调用与以前相同的初始化例程)但是,当执行 DataContext=mainViewModel
集时,我在输出窗口中看到一堆绑定(bind)错误。有趣的是,只有一个标签页( subview 模型)内的绑定(bind)被破坏了。其他 2 个 subview 模型正常运行 - 没有绑定(bind)错误。
System.Windows.Data Error: 40 : BindingExpression path error: 'RphGaugeMaxScale' property not found on 'object' ''MainViewModel' (HashCode=38546056)'. BindingExpression:Path=RphGaugeMaxScale; DataItem='MainViewModel' (HashCode=38546056); target element is 'Gauge' (Name='GaugeControl'); target property is 'MaxValue' (type 'Double')
System.Windows.Data Error: 40 : BindingExpression path error: 'RphGaugeMaxScale' property not found on 'object' ''MainViewModel' (HashCode=38546056)'. BindingExpression:Path=RphGaugeMaxScale; DataItem='MainViewModel' (HashCode=38546056); target element is 'Gauge' (Name='GaugeControl'); target property is 'MajorTickCount' (type 'Int32')
...
属性存在于 SubViewModel2 上,但查找使用的是 MainViewModel。
接下来,我在 MainView 上添加了一个刷新方法(在重新应用 DataContext 后调用)来执行此操作
_tabPageForVM2.DataContext = null;
_tabPageForVM2.DataContext = mainVM.PropReturningSubVM2;
这解决了问题。
让我困惑的是
最佳答案
您可以下载Snoop或其他向您显示可视化树的工具,您会看到 TabItem 的内容实际上不是此 TabItem 的可视子项,而是 TabControl 的可视化子项。
所以 TabItem 是 TabItem 内容的逻辑子项,而 TabControl 是 TabItem 内容的可视子项。 DataContext 应该继承自逻辑父级,但在我看来它是随机继承自 TabItem 或 TabControl。
我建议的最佳解决方案是将绑定(bind)移动到内容,如下所示:
<TabItem x:Name="LeftTabPage" Header="LeftModel">
<StackPanel Orientation="Horizontal" DataContext="{Binding Left}">
<my:Gauge x:Name="gauge" Height="200" Width="200" Value="{Binding LeftProp}"/>
<Viewbox Height="200" Width="200" >
<my:Gauge x:Name="scaledGauge" Value="{Binding LeftProp}"/>
</Viewbox>
</StackPanel>
</TabItem>
<TabItem x:Name="MiddleTabPage" Header="{Binding}">
<TextBox x:Name="MiddleTabTextbox" DataContext="{Binding Middle}" Text="{Binding MiddleProp}" />
</TabItem>
<TabItem x:Name="RightTabPage" Header="RightModel">
<TextBox DataContext="{Binding Right}" Text="{Binding RightProp}"/>
</TabItem>
我想我明白了。我会尽力解释。
如果第二个选项卡处于事件状态(例如),则 MiddleTabTextbox 是 MiddleTabPage 的逻辑子项并且是 MyTabControl 的可视子项(它有 2 个不同的父项和 2 个不同的 DataContext)。第一个选项卡未激活,它只有逻辑子项 - StackPanel。当您单击按钮时,DataContext 发生变化。 StackPanel 没问题——它只有一个父级。但是 MiddleTabTextbox 应该做什么呢?它应该从可视父级还是逻辑父级获取 DataContext?从逻辑父级获取上下文似乎是合乎逻辑的:)我解释了这种行为,但是 MiddleTabTextbox 从视觉子级获取它,即 MyTabControl。因此,不是获取 MiddleViewModel,而是获取带有一堆绑定(bind)错误的 MainViewModel。我不知道为什么 WPF 从视觉父类而不是逻辑父类继承 DataContext。
关于wpf - 调试 : Why a data-bound section breaks off when DataContext is reapplied?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4331424/
我在我的项目中添加了一个 LinqToSQL 类并将它放在我的 App_code 文件夹中。 然后,我将 LinqDataSource 添加到新网页并尝试将其配置为使用此类,但它并未在 DataCon
在我的带有 EF6 的 MVC 5 应用程序中开始使用接口(interface)和 Ninject 并遇到了问题。 我调用多个实现来获取数据,当保存它时,实体断开连接并且存在多对多和类似问题。 所以我
因此,我在我的 View 模型中保留了一个对象 NewMyItem 作为负责在列表中添加新项目的控件的 DataContext。每当执行 AddCommand 时,我都会重置该对象,以便它可以添加另一
这个问题与我之前在这里的问题有关:Predicate won't validate parameter correctly 首先是关于我的模型的一些信息: 基础 View 模型: public abs
我正在尝试使用数据绑定(bind)将 ObservableCollection 绑定(bind)到 DataGrid 的 ItemsSource,因为我了解了 WPF 和其他东西。 在代码隐藏中,我可
使用 Linq-to-Sql 时,Visual Studio 会为您创建一个 DataContext 类。我想知道什么时候实例化这个上下文,在我的一个项目中,我使用了一个 DataContext 实例
我有一个包含控件的窗口。 该控件有一个设置为 DataContext 对象的 View 模型。 Window 对象有自己的 ViewModel 设置为 DataContext。 如果我在 Window
您好,我正在尝试制作一个带有 PathData 的自定义按钮。到目前为止,我已经设法查看了其中的路径。但是我的 Button 没有接受 MVVM 命令。 自定义按钮 XAML
我对MVVM特别陌生。 我有以下XAML代码:
我在使用 linq to sql 进行 asp.net c# Web 应用程序的 DataContexts 时遇到一些问题。 我首先遇到了抛出异常的问题,因为我没有处理 DataContext,与 t
作为问题的延续Linking DataContext with another property in WPF . 在研究的最后,我非常惊讶地发现,当有人写下这样的东西时: Content 属性所绑
这应该很容易,但它会引发 VS2008 的严重循环。 我正在尝试使用 MVVM 的 WPF,尽管我已经开发了大约 15 年,并且有一个比较,但我还是一个新手。科学。程度。在当前客户端,我需要使用 VB
我在这样的后台线程中为 wpf 窗口获取数据 [framework 4.0 with async/await]: async void refresh() { // returns objec
当心,这是一个相当基本的问题(我认为)。 我有一个名为 MyUserControl 的 UserControl。我在我的 ListBox 的 DataTemplate 中使用它: 现在我想在 MyU
我有一个应用程序需要将来自多个数据库的表连接到单个 LINQ-to-SQL 查询中。不幸的是,我为每个数据库设置了一个单独的 DataContext 类,因此该查询将不起作用。我收到这样的错误:“查询
是否可以通过 XAML 将一些数据传递到绑定(bind)源/数据上下文? 在我的特定情况下,我希望为绑定(bind)源提供对创建它的窗口的引用。 例如:
我一直在查看 MSDN 文章 WPF Apps With The Model-View-ViewModel Design Pattern . 上面的文章展示了他是如何使用DataTemplate 来显
我使用 VS 2008 中的 ORM 设计了我的数据库。 将其导出到 SQL Server 以便在 SQL Server 上创建表和关系的最佳方法是什么? 谢谢, 京东 最佳答案 如果您使用的是 LI
我在 C#、WPF 中有以下代码: base.DataContext = new DataTemplate[] { new Da
我有一个以这种方式在父控件中使用的 UserControl: 父控件 DataContext 是一个包含 SelectedEntity 属性的 ViewModel。 在我的子 UserControl
我是一名优秀的程序员,十分优秀!