【问题标题】:WPF -- Anyone know why I can't get this binding to reference?WPF -- 任何人都知道为什么我不能得到这个绑定来引用吗?
【发布时间】:2009-08-18 17:42:03
【问题描述】:
<StackPanel x:Name="stkWaitingPatients" Width="300" Margin="0,0,0,-3"
   DataContext="{Binding Mode=OneWay, Source={StaticResource local:oPatients}}">

我得到的 StaticResource 参考 'local:oPatients' 没有找到。

下面是代码:

    public partial class MainWindow : Window
{
    ListBox _activeListBox;
    clsPatients oPatients;

    public MainWindow()
    {
        oPatients = new clsPatients(true);

...

【问题讨论】:

  • 您的用户名显示为“未知”,您可能需要编辑您的用户资料。
  • 当我开始时,它要求我提供我的谷歌帐户或其他东西,这就是发生的事情......我会努力的! ;)

标签: wpf binding


【解决方案1】:

为了能够将对象寻址为StaticResource,它需要位于资源字典中。但是,由于您是在 MainWindow 的构造函数中创建对象,因此您可以像这样在代码隐藏中设置 DataContext

oPatients = new clsPatients(true);
stkWaitingPatients.DataContext = oPatients;

然后把Binding改成这样:

{Binding Mode=OneWay}

如果您不打算再次更改DataContext,这是一个不错的做法,否则您需要更灵活的解决方案。

编辑:您在评论中提到了ObjectDataProvider。下面是你如何做到这一点。首先,为System 命名空间添加一个xmlns:sysWindow(我假设你已经有一个xmlns:local):

xmlns:sys="clr-namespace:System;assembly=mscorlib"

然后您可以像这样将ObjectDataProvider 添加到您的资源字典中:

<Window.Resources>
    <ObjectDataProvider
        x:Key="bindingPatients"
        ObjectType="{x:Type local:clsPatients}">
        <ObjectDataProvider.ConstructorParameters>
            <sys:Boolean>True</sys:Boolean>
        </ObjectDataProvider.ConstructorParameters>
    </ObjectDataProvider>
</Window.Resources>

并在 Binding 中使用 StaticResource 标记引用它,使用我们在字典中提供的 x:Key 附加属性中指定的相同字符串:

{Binding Source={StaticResouce bindingPatients}, Mode=OneWay}

编辑 2: 好的,您在答案中发布了更多代码,现在我知道为什么它会在构造函数期间引发异常。您正在尝试这样做...

lstWaitingPatients.DataContext = oPatients;

...但lstWaitingPatients 直到this.InitializeComponent() 完成后才真正存在。 InitializeComponent() 加载 XAML 并执行许多其他操作。除非你真的需要在这之前做一些事情,否则将自定义启动代码放在调用InitalizeComponent()WindowLoaded 事件的事件处理程序中。

【讨论】:

  • 我只是试图将数据上下文移动到代码隐藏中,以便我可以捕获错误(如错误的连接字符串),然后移动到用户友好的错误页面......想不出了解如何在 XAML 中使用和 ObjectDataSource 来做到这一点......现在试试这个......
  • 不,我得到一个通用的“无法创建 Window 实例”...我可以给您发送更多代码吗?这让我发疯了!
  • 这意味着您在 Window 的构造函数期间发生了异常,可能是由于 XAML 中的错误。向您发送更多代码无济于事,看到您的代码会。您是否将xmlns:sys 放在Window 标签内?是否已经有一个 &lt;Window.Resources&gt; 现在有 2 个?它可能有很多东西。
  • 你尝试了哪一个?在代码隐藏中分配DataContext
  • 哇,我明白了!呃,我把 DataContext 赋值放在 InitializeComponent 之后怎么样?!谢谢!!!
【解决方案2】:

下面设置Code Behind中的ItemsSource并正确处理DataBinding:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        clsPatients oPatients = new clsPatients(true);

        //assuming oPatients implements IEnumerable
        this.lstWaitingPatients.ItemsSource = oPatients;

还有 XAML:

<ListBox x:Name="lstWaitingPatients"       
         IsSynchronizedWithCurrentItem="true"
         ItemTemplate="{StaticResource WaitingPatientsItemTemplate}"
         FontSize="21.333" Height="423.291"
         ScrollViewer.VerticalScrollBarVisibility="Visible"
         GotFocus="lstWaitingPatients_GotFocus"
         />

【讨论】:

  • 但是,我会选择 @Joel 的答案中的 ObjectDataProvider。
【解决方案3】:

现在,我无法让它工作...我收到一般的 Windows 启动错误。

这里是初始化器和被实例化的类的代码隐藏:

    public partial class MainWindow : Window
{
    ListBox _activeListBox;

    public MainWindow()
    {
        clsPatients oPatients = new clsPatients(true);
        lstWaitingPatients.DataContext = oPatients;

        this.InitializeComponent();

这是我的 XAML 的顶部:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Orista_Charting"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" 
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
x:Class="Orista_Charting.MainWindow"
x:Name="windowMain"
Title="Orista Chart"
Width="1024" Height="768" Topmost="True" WindowStartupLocation="CenterScreen" Activated="MainWindow_Activated" >


<Window.Resources>        

    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Resources/ButtonStyles.xaml"/>
            <ResourceDictionary Source="Resources/OtherResources.xaml"/>
            <ResourceDictionary Source="Resources/TextBlockStyles.xaml"/>
            <ResourceDictionary Source="Resources/Converters.xaml"/>
        </ResourceDictionary.MergedDictionaries>

这是相关的 XAML,如您所见,我继续将 DataContext 从 StackPanel 移到 ListBox。这不会运行,但会在设计视图中呈现(但是,ListBox 中没有数据):

<!-- Waiting Patients List -->
    <Border BorderThickness="1,1,1,1" BorderBrush="#FF000000" Padding="10,10,10,10" 
            CornerRadius="10,10,10,10" Background="#FFFFFFFF" Margin="15.245,187.043,0,41.957" HorizontalAlignment="Left" >
        <StackPanel x:Name="stkWaitingPatients" Width="300" Margin="0,0,0,-3"> 

            <StackPanel Orientation="Horizontal">    
                <TextBlock Text="Waiting Patients:" VerticalAlignment="Center" FontSize="21.333" Margin="0,0,0,20"/>
                <TextBlock HorizontalAlignment="Right" Margin="0,0,38.245,0" Width="139" Height="16" 
                Text="Minutes Waiting" TextWrapping="Wrap" Foreground="#FF9C2525" FontWeight="Bold" VerticalAlignment="Bottom"
                TextAlignment="Right"/> 
                <!-- Too be implemented, this is the wait animation -->
                <!--<Image x:Name="PollGif" Visibility="{Binding Loading}"
                       HorizontalAlignment="Left" Margin="100,0,0,0" Width="42.5" Height="42.5" 
                       Source="Images/loading-gif-animation.gif" Stretch="Fill"/>-->       
            </StackPanel>                  

            <ListBox x:Name="lstWaitingPatients"       
                     DataContext="{Binding Mode=OneWay}" ItemsSource="{Binding Mode=OneWay}"
                     IsSynchronizedWithCurrentItem="true"
                     ItemTemplate="{StaticResource WaitingPatientsItemTemplate}"
                     FontSize="21.333" Height="423.291" ScrollViewer.VerticalScrollBarVisibility="Visible"
                     GotFocus="lstWaitingPatients_GotFocus"
                     />

        </StackPanel>
    </Border>

好的,但是如果我只是将代码隐藏中的分配行注释掉,它会运行(尽管列表框中没有数据):

    public partial class MainWindow : Window
{
    ListBox _activeListBox;

    public MainWindow()
    {
        clsPatients oPatients = new clsPatients(true);
        //lstWaitingPatients.DataContext = oPatients;

谢谢!

【讨论】:

  • 正如 Sixlettervariables 在他的回答中指出的那样,您不需要在 ListBox 上进行的某些绑定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
相关资源
最近更新 更多