我正在尝试将列表框的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>
我有一个按钮,其中click事件将列表框的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'的绑定源。 BindingExpression:路径=的SelectedItem;的DataItem = NULL; target元素是'StackPanel'(Name =''); target属性是'DataContext'(类型'Object')
不确定我做错了什么。我是WPF的新手。
如果我删除了stackpanel资源(testsp)并用testsp控件替换了contentcontrol,那么数据绑定工作正常。我也可以将txt1和txt2直接绑定到资源中的BlockToolBar对象,但是如果在资源中,我似乎无法将txt1 / txt2绑定到selecteditem。
我这样做的原因是我有一个复杂的主窗口,我分成了单独的资源,并通过contentcontrols调用我的主窗口。当我无法实现这一点时,我创建了一个更简单的项目来尝试缩小我的问题范围。
答案 0 :(得分: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;
}