WPF绑定到父级DataContext

36 浏览
0 Comments

WPF绑定到父级DataContext

我们有一个WPF应用程序,使用标准的MVVM模式,利用Cinch(因此也使用MefedMVVM)进行View->ViewModel解析。这很有效,我可以将相关控件绑定到ViewModel上的属性。

在特定的视图中,我们有一个Infragistics XamGrid。该网格绑定到ViewModel上的ObservableCollection,并显示适当的行。但是,我还有一个特定的列在该网格上,我试图将文本框文本值绑定到父DataContext上的属性,而不是ObservableCollection。这个绑定失败了。

我们已经尝试了几个选项,包括:

  1. 使用AncestorType 跟踪上溯并绑定到父UserControl的DataContext,如以下示例所示(来自于这个问题的好答案, 以及这个)。...
    {Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}
    

  2. 指定ElementName并试图直接定位到顶层控件。如果您想阅读有关使用ElementName的文章,请看这里
  3. 使用在UserControl资源中定义的\'代理\'FrameorkElement,以尝试按需要\'传递\'上下文。我们将元素定义如下,然后将其引用为静态资源...
    
    

在这种情况下,绑定发现了FrameworkElement,但是无法访问其之上的任何内容(在指定Path时)。

经过研究,这看起来很可能是由于Infragistics XamGrid在树外构建列所致。但是,即使是这种情况,至少选项2或3应该可以正常工作。

我们最后的想法是它与V-VM绑定有关,但即使使用Snoop,我们也无法找到确切的问题所在。我对WPF绑定并不是专家,因此欢迎任何指针。

编辑:我在Infragistics的这里找到了一些模板示例,我将尝试。

编辑2:正如@Dtex指出的那样,模板是可行的方法。以下是与XamGrid一起使用的相关片段:

                
                    
                        
                    
                
                

我留下了XML未关闭...您可以添加所需的列,然后关闭相关标记。

admin 更改状态以发布 2023年5月21日
0
0 Comments

因为这样的事情,通常作为一个经验法则,我尽可能避免 XAML 的“诈术”,尽可能保持 XAML 蠢和简单,并在 ViewModel(或依赖属性或 IValueConverters 等,如果真的必要)中完成其余的工作。

如果可能的话,我会给当前 DataContext 的 ViewModel 引用(即属性)对应的父 ViewModel,并直接绑定它。

public class ThisViewModel : ViewModelBase
{
    TypeOfAncestorViewModel Parent { get; set; }
}

然后直接绑定它。

0
0 Comments

我不知道关于XamGrid,但这是我在标准的WPF DataGrid上会做的:


    
        
            
                
                    
                
            
            
                
                    
                
            
        
    

由于在单元格模板中指定的TextBlockTextBox将成为可视树的一部分,因此您可以向上查找并找到所需的任何控件。

0