2009-08-18 50 views
0
<StackPanel x:Name="stkWaitingPatients" Width="300" Margin="0,0,0,-3" 
    DataContext="{Binding Mode=OneWay, Source={StaticResource local:oPatients}}"> 

我收到StaticResource參考'local:oPatients'was found。WPF - 任何人都知道我爲什麼不能將這個綁定引用?

這裏是隱藏代碼:

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

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

... 
+0

您的用戶名顯示爲「未知」,你可能想編輯您的用戶個人資料。 – 2009-08-18 17:56:26

+0

當我開始時,它問我的谷歌帳戶或什麼,這就是發生了什麼......我會努力! ;) – LSTayon 2009-08-18 18:04:21

回答

2

爲了能夠解決的對象作爲StaticResource,它需要在一個資源字典。但是,由於您是在MainWindow的構造函數中創建對象的,因此可以像這樣在代碼隱藏中設置DataContext

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

,然後更改Binding這樣:

{Binding Mode=OneWay} 

這是如果你不打算再次改變DataContext一個確定的做法,否則你會希望有一個更靈活的解決方案。

編輯:您在評論中提到ObjectDataProvider。以下是你如何做到這一點。首先,添加一個xmlns:sysWindowSystem命名空間(我假設你已經有一個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> 

並用StaticResource這樣的標記在Binding中引用它,使用我們在x:Key附加屬性中指定的字符串,我們在字典中給出了它:

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

編輯2:好吧,你在你的答案張貼更多的代碼,現在我知道爲什麼它的構造函數中拋出異常。你試圖做到這一點...

lstWaitingPatients.DataContext = oPatients; 

...但lstWaitingPatients實際上並不存在,直到後this.InitializeComponent()完成。 InitializeComponent()加載XAML並執行一系列其他操作。除非您真的需要在此之前做一些事情,否則在之後將自定義啓動代碼撥打InitalizeComponent()或撥打WindowLoaded事件的事件處理程序。

+0

我只是試圖將datacontext移動到代碼隱藏,以便我可以捕獲錯誤(如不良連接字符串),然後移動到用戶友好的錯誤頁面...無法弄清楚如何做到這一點在XAML中使用和ObjectDataSource ... 立即試用此... – LSTayon 2009-08-18 18:05:41

+0

不,我得到一個通用的「無法創建窗口的實例」...我可以給你更多的代碼?這讓我瘋狂! – LSTayon 2009-08-18 18:26:02

+0

這意味着您在'Window'的構造函數中發生異常,可能是由於XAML中的錯誤。看到你的代碼會發送更多的代碼將無濟於事。你把'xmlns:sys'放在Window標籤裏了嗎?有沒有''現在有2個?有很多事情可能會發生。 – 2009-08-18 18:40:11

0

現在,我無法得到這個工作...我得到一個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。這不運行,但它確實使在設計視圖(不過,沒有出現在列表框數據):

<!-- 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> 

好了,但如果我只是把在代碼隱藏註釋掉分配新建分配FY線,它運行(儘管列表框中沒有數據):

public partial class MainWindow : Window 
{ 
    ListBox _activeListBox; 

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

感謝!

+0

由於sixlettervariables在他的回答中提到,你不需要你在'ListBox'上做的一些綁定。 – 2009-08-18 19:15:23

1

下套的ItemsSource的代碼隱藏和正確處理數據綁定:

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" 
     /> 
+0

但是,我會從@ Joel的回答中找到ObjectDataProvider。 – user7116 2009-08-18 19:16:24

相關問題