代码之家  ›  专栏  ›  技术社区  ›  ChadT

如何在codebhind中访问silverlight控件的datacontext

  •  4
  • ChadT  · 技术社区  · 15 年前

    <MyControls:SomeControl DataContext="{Binding}" />
    

    在该文件的代码隐藏中,如何访问此数据上下文?this.DataContext等于空。

    编辑(更多信息):

    <DataTemplate x:Key="AnImportantIdentifierUsedByTheHostApp">
        <MyControls:SomeControl DataContext="{Binding}" />
    </DataTemplate>
    

    在我的控制范围内,我可以绑定如下属性:

    <Hyperlink NavigateUri="{Binding Path=UriWithSlug}">
    

    这一切都很好。但是,对于某些功能(特别是,我需要使用WebBrowser控件和NavigateToString()方法),我需要从DataContext访问属性。

    myWebBrowser.NavigateToString(DataContext.MyHTMLStringProperty);
    
    4 回复  |  直到 15 年前
        1
  •  3
  •   AnthonyWJones    15 年前

    你不需要 DataContext={Binding} 因为那等于 DataContext = DataContext .

    DataContext .

    如果你能确定这一点,那就是:-

    myWebBrowser.NavigateToString(((MyType)DataContext).MyHTMLString); 
    

    如果无法确定类型和/或无法说服控制控件宿主的人确保至少实现与已知成员的特定接口,则可能需要自己进行反射。

    如果您不能只知道属性的名称,则可以选择:-

    public string HTMLString
    {
       get { return (string)GetValue(HTMLStringProperty); }
       set { SetValue(HTMLStringProperty, value); }
    }
    public static DependencyProperty HTMLStringPropery =
       DependencyProperty.Register(
          "HTMLString",
          typeof(string),
          typeof(SomeControl),
          null);
    

    现在,如果确定知道要绑定的属性的名称,则可以在控件构造函数的代码中设置绑定:-

    SetBinding(HTMLStringProperty, new Binding("MyHTMLString"));
    

    有了它,您的代码将如下所示:-

    myWebBrowser.NavigateToString(HTMLString);
    

    或者,您可以将绑定控件的这个新属性作为Xaml的职责:-

    <DataTemplate x:Key="AnImportantIdentifierUsedByTheHostApp">                  
        <MyControls:SomeControl HTMLString="{Binding MyHTMLString}" />                  
    </DataTemplate> 
    
        2
  •  1
  •   ChadT    15 年前

    答案当然是非常直截了当的,我相信每个人都认为我在做。。。

    在控件的 Loaded 已触发事件。

    public MyUserControl() {
        var dc = this.DataContext // DataContext is null here in the ctor.
    
        this.Loaded += (s, e) => {
            var sc2 = this.DataContext // Loaded event fires, DataContext exists!
        };
    }
    

        3
  •  0
  •   iCollect.it Ltd    15 年前

    好吧,现在说得更有道理了。相应地更改答案。。。

    基本上,您不应该需要DataContext={Binding}。项的DataContext由父控件设置(每个项)。在大多数由ItemsSource中的条目生成的列表类型控件中。

    1. 你能删除DataContext={Binding}并检查它是否仍然有效吗?

    您能否提供更多的代码/xaml,我们可以在上下文中看到上面的内容?

        4
  •  0
  •   MCS    15 年前
    var mytype = this.DataContext as MyType;
    

    作为预防措施,我将在之后检查是否为空:

    if (mytype!=null)
    {
        // do something here
        myWebBrowser.NavigateToString(mytype.MyHTMLStringProperty);
    }