- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题与我之前在这里的问题有关:Predicate won't validate parameter correctly
首先是关于我的模型的一些信息:
基础 View 模型:
public abstract class BaseViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _name;
public string Name
{
get
{
return _name;
}
set
{
if (Name != value)
{
_name = value;
OnPropertyChanged("Name");
}
}
}
private BaseViewModel _homePage;
public BaseViewModel HomePage
{
get
{
return _homePage;
}
set
{
if (HomePage != value)
{
_homePage = value;
OnPropertyChanged("HomePage");
}
}
}
public void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler temp = PropertyChanged;
if (temp != null)
{
temp(this, new PropertyChangedEventArgs(propertyName));
}
}
}
问题:
<Button Content="{Binding Name}" Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
CommandParameter="{Binding HomePage}"/>
正如您在 BaseViewModel 中看到的,属性“Name”和“HomePage”在同一类中定义,因此如果 DataContext 是派生自“BaseViewModel”的 ViewModel,则它们应该是可访问的。起初我失去了理智,因为似乎没有任何效果 - 输出窗口显示无法检索“主页”的值 - 除了每次都正确绑定(bind)的名称之外。
在我几乎要放弃之后,我将我的 View 命名为“Test”并尝试沿 ElementName 重定向 CommandProperty 绑定(bind) - 它成功了:
<Button Content="{Binding Name}" Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
CommandParameter="{Binding DataContext.HomePage, ElementName=Test}"/>
但是为什么?为什么可以在不分配 ElementName 的情况下绑定(bind)的 Name 属性和需要 ElementName 的 HomePage 之间的 DataContext 不同?
更新 1:
MainViewModel : BaseViewModel
private RelayCommand _command;
public RelayCommand ChangePageCommand {
get {
return _command ?? (_command = new RelayCommand(p => ChangeViewModel((BaseViewModel)p), x => {
return x is BaseViewModel;
}));
}
}
public void ChangeViewModel(BaseViewModel viewModel) {
CurrentPageViewModel = viewModel;
}
更新 2:
<Window.Resources>
<DataTemplate DataType="{x:Type home:HomeViewModel}">
<home:Home/>
</DataTemplate>
<DataTemplate DataType="{x:Type ua:UserAdministrationViewModel}">
<ua:UserAdministration/>
</DataTemplate>
</Window.Resources>
<ContentControl Content="{Binding CurrentPageViewModel}"/>
更新 3:
现在它变得非常奇怪 - 我尝试添加一个 TextBlock 并将其直接绑定(bind)到 HomePage.Text - 它有效。
<Button Height="50" Content="{Binding Name}" Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
CommandParameter="{Binding DataContext.HomePage, ElementName=Test}"/>
<TextBlock Text="{Binding HomePage.Name}"/>
那么,为什么在绑定(bind)到 CommandParameter 时不能直接访问 HomePage,而是将 TextBlock 的 Text 属性直接绑定(bind)到 HomePage.Name 就可以了?
更新 4:
输出窗口说:
System.Windows.Data 信息:10:无法使用绑定(bind)检索值,并且不存在有效的回退值;使用默认代替。绑定(bind)表达式:路径=名称;数据项=空;目标元素是 'Button' (Name='');目标属性是“内容”(类型“对象”)
System.Windows.Data 信息:10:无法使用绑定(bind)检索值,并且不存在有效的回退值;使用默认代替。 BindingExpression:Path=DataContext.ChangePageCommand;数据项=空;目标元素是“按钮”(名称='');目标属性是“命令”(类型“ICommand”)
System.Windows.Data 信息:10:无法使用绑定(bind)检索值,并且不存在有效的回退值;使用默认代替。绑定(bind)表达式:路径=主页;数据项=空;目标元素是 'Button' (Name='');目标属性是“CommandParameter”(类型“Object”)
System.Windows.Data 信息:10:无法使用绑定(bind)检索值,并且不存在有效的回退值;使用默认代替。 BindingExpression:Path=HomePage.Name;数据项=空;目标元素是“TextBlock”(名称='');目标属性是“文本”(类型“字符串”)
但是除了 CommandParameter 之外的所有东西都成功绑定(bind)了。刷新绑定(bind)后,CommandParameter(和底层 CanExecute-Method)是否有可能不会重新验证?也许绑定(bind)一开始会失败,但除了 CommandParameter 之外的每个绑定(bind)都会得到刷新和重新验证。但是我该如何解决这个问题呢?
最佳答案
我很自豪地宣布我已经解决了这个愚蠢的问题:
我假设我用来将我的 CommandBinding 重定向到 Window 的 ViewModel 的 RelativeSource 破坏了所有后续属性(!不是控件)的 DataContext。
不工作:
<Button Grid.Row="0"
Grid.Column="0"
Height="50"
Content="{Binding PreviousPageViewModel.Name}"
Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding PreviousPageViewModel}" />
工作:
<Button Grid.Row="0"
Grid.Column="0"
Height="50"
Content="{Binding PreviousPageViewModel.Name}"
CommandParameter="{Binding PreviousPageViewModel}"
Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType=Window}}"/>
所以在这种情况下,属性的顺序很重要。
注意:以下所有控件的 DataContext 都是正确的。
关于c# - CommandParameter 上的 DataContext 与 Command 本身上的 DataContext 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36589122/
Closed. This question needs details or clarity。它当前不接受答案。 想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。 4
我有followwing结构 some text Delete 是否可以使用指针事件禁用 div:除了保持按钮处于事件状态之外没有其他功能? 我试过 div.offline:not(.delete)
Here's my fiddle. 基本上我有一个父 div,需要在它周围有一个框阴影,由于各种原因,这个框阴影必须是一个伪元素。此框阴影会阻止捕获此父 div 的子项上的悬停事件。我该如何解决这个问
Cypress 在 Jenkins 中成功使用。从几周 Cypress 规范文件开始,它将永远挂起。它将卡在不同的规范文件中,这使得调试和查找失败的原因变得困难。有时它会成功运行所有规范文件。请帮帮我
我可能遇到了 DOM 和 jQuery 的问题。 我有这个 HTML 结构: 140,86
我有 View Controller A 和 View Controller B。A 具有 B 的序列。A 嵌入在导航 Controller 中。 导航栏在 A 上显示正常,但是在 B 上没有显示。我
试图解决一个有趣的 CSS 问题。 我正在尝试呈现一个最终必须位于相对父级(容器)内部的模态。我需要它是一个固定的叠加层,以便它覆盖整个视口(viewport)。下面包含的代码片段是为了简洁起见。 .
如何让一个自由落体的 Sprite 节点坐在另一个水平移动的 Sprite 体上? 现在两个 body 都发生了碰撞。但是水平运动的物体偏离了它的路径,自由落体撞击水平物体后下降。如何修复 Sprit
我想知道是否可以像这样对第 n 个 child 使用悬停 #gallery a img:hover { display: block; height:300px; width:
这个问题在这里已经有了答案: Why don't flex items shrink past content size? (5 个答案) 关闭 3 年前。 我有一个带有 flex: 1 的 fle
这个问题在这里已经有了答案: How to style the parent element when hovering a child element? (8 个答案) 关闭 9 年前。 所以我有
这个问题在这里已经有了答案: How to style the parent element when hovering a child element? (8 个答案) 关闭 9 年前。 所以我有
所以我的处境有点棘手。基本上我有这个可滚动的水平导航,它有一个 overflow-x: auto。导航具有与悬停时出现的下拉菜单的链接。 溢出会阻止下拉列表在未将其位置设置为 absolute 的情况
在 css 中有什么方法可以只选择悬停的容器子而不需要父级,这可以用 css 实现吗? 这就是我正在尝试的,应该选择最深的容器而不是我添加的 .decor 只是为了显示所选的 div。(这些 chil
有这个 parent : class BaseModel extends Eloquent { protected static $rules = []; public static
我有一个用作编辑器 View 的自定义窗口类,并且由于我直接处理键盘事件,所以我希望在顶部有一个标准的编辑控件来输入文本。我的问题很简单:我也想在用户点击自定义窗口类时获取焦点,所以我处理 WM_MO
我是一名优秀的程序员,十分优秀!