【问题标题】:Databinding not working within resource dictionary数据绑定在资源字典中不起作用
【发布时间】:2011-02-18 18:24:00
【问题描述】:

我正在尝试将列表框的 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 (express) 输出窗口为我提供以下信息:System.Windows.Data 错误:4:找不到引用“ElementName=lsbCommonBlocks”的绑定源。绑定表达式:路径=选定项;数据项=空;目标元素是'StackPanel'(名称='');目标属性是“DataContext”(类型“对象”)

不知道我做错了什么。我对 WPF 很陌生。

如果我删除 stackpanel 资源 (testsp) 并将 contentcontrol 替换为 testsp 控件,那么数据绑定将起作用。我也可以将 txt1 和 txt2 直接绑定到资源中的 BlockToolBar 对象,但我似乎无法将 txt1/txt2 绑定到资源中的选定项。

我这样做的原因是我有一个复杂的主窗口,我将其分解为单独的资源字典并通过 contentcontrols 调用我的主窗口。当我无法让它工作时,我创建了一个更简单的项目来尝试缩小我的问题。

【问题讨论】:

    标签: xaml data-binding resourcedictionary


    【解决方案1】:

    看起来必须在代码中创建绑定。我进行了以下更改并且它有效。以为我以前试过这个,但是......

    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;
    
        }
    

    【讨论】:

      猜你喜欢
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2021-08-08
      相关资源
      最近更新 更多