2011-02-18 74 views
0

我正在嘗試將列表框的SelectedItem屬性綁定到兩個文本框控件。這些控件位於windows資源部分。這個想法是當列表框中的一個條目被選中時,兩個文本框控件顯示我的自定義類中的「blockName」和「blockHelpText」。我通過單擊but1按鈕首先加載列表框。數據綁定在資源字典中不起作用

<Window.Resources> 
<StackPanel x:Key="testsp" Visibility="Visible" DataContext="{Binding ElementName=lsbCommonBlocks, Path=SelectedItem, diagnostics:PresentationTraceSources.TraceLevel=High}"> 
     <ListBox x:Name="lsbCommonBlocks" DisplayMemberPath="BlockName" SelectionChanged="lb_sc"/> 
     <Button x:Name="but1" Click="but1_click" Content="Button 1"/> 
     <TextBox x:Name="txt1" Text="{Binding Path=BlockName, diagnostics:PresentationTraceSources.TraceLevel=High}"/> 
     <TextBox x:Name="txt2" Text="{Binding Path=BlockHelpText, diagnostics:PresentationTraceSources.TraceLevel=High}"/> 
    </StackPanel> 
</Window.Resources> 
<Grid> 
    <ContentControl Visibility="Visible" x:Name="contentWorkArea" Content="{StaticResource testsp}"/> 
</Grid> 

我有一個單擊事件按鈕將列表框的Itemsources屬性綁定到我的自定義類BlockToolBar。

BlockToolBar[] blocks = { new BlockToolBar("Block 1", "No help for this block."), 
           new BlockToolBar("Block 2", "Help."), 
           new BlockToolBar("Block 3", "Help again.") }; 

private void but1_click(object sender, RoutedEventArgs e) 
    { 
     StackPanel sp = (StackPanel)this.TryFindResource("testsp"); 
     ListBox lb = (ListBox)LogicalTreeHelper.FindLogicalNode(sp, "lsbCommonBlocks"); 
     lb.ItemsSource = blocks; 
    } 

public class BlockToolBar : INotifyPropertyChanged 
{ 
    private string blockName; 
    public string BlockName 
    { 
     get { return blockName; } 
     set { 
      blockName = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("BlockName")); 
     } 
    } 

    private string blockHelpText; 
    public string BlockHelpText 
    { 
     get { return blockHelpText; } 
     set { 
      blockHelpText = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("BlockHelpText")); 
     } 
    } 

    public BlockToolBar() 
    { 
     blockName = ""; 
     blockHelpText = ""; 
    } 

    public BlockToolBar(string BlockName, string BlockHelpText) 
    { 
     blockName = BlockName; 
     blockHelpText = BlockHelpText; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, e); 
    } 
} 

數據綁定不起作用:當我單擊按鈕時,TextBox的txt1和txt2保持空白。列表框填充好。我確認我可以通過在列表框上創建一個事件來獲取BlockToolBar屬性。

Visual Studio(快速)輸出窗口給我下面:System.Windows.Data錯誤:4:找不到與引用'ElementName = lsbCommonBlocks'綁定的源。 BindingExpression:路徑=的SelectedItem;的DataItem = NULL;目標元素是'StackPanel'(Name ='');目標屬性是'DataContext'(類型'對象')

不知道我在做什麼錯。我對WPF很感興趣。

如果我刪除stackpanel資源(testsp)並用testsp控件替換contentcontrol,則數據綁定工作。我也可以將txt1和txt2直接綁定到資源中的BlockToolBar對象,但我似乎無法將txt1/txt2綁定到選定項目(如果在資源中)。

我這樣做的原因是我有一個複雜的主窗口,我分解成單獨的資源緩存並通過內容控件調用我的主窗口。當我無法工作時,我創建了一個更簡單的項目,試圖縮小我的問題範圍。

回答

0

看起來像必須在代碼中創建綁定。我做了下面的改變,它工作。以爲我之前嘗試過,但是...

private void but1_click(object sender, RoutedEventArgs e) 
    { 
     StackPanel sp = (StackPanel)this.TryFindResource("testsp"); 
     ListBox lb = (ListBox)LogicalTreeHelper.FindLogicalNode(sp, "lsbCommonBlocks"); 

     Binding myBinding = new Binding(); 
     myBinding.Source = lb; 
     myBinding.Path = new PropertyPath("SelectedItem"); 
     sp.SetBinding(StackPanel.DataContextProperty, myBinding); 

     lb.ItemsSource = blocks; 

    }