我还没有找到在XAML中做这件事的方法,但我已经在代码后台中做到了。以下是我采取的方法。
首先,我想为ItemsControl
中的所有项目执行此操作。因此,我的XAML看起来像这样:
<ListBox x:Name="_events" ItemsSource="{Binding Path=Events}">
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type Events:EventViewModel}">
<TextBlock Name="ActualText" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
然后,在代码后台构建中,我订阅了
ItemContainerGenerator
:
InitializeComponent();
_events.ItemContainerGenerator.StatusChanged
+= OnItemContainerGeneratorStatusChanged;
这个方法看起来像:
private void OnItemContainerGeneratorStatusChanged(object sender, EventArgs e)
{
if (_events.ItemContainerGenerator.Status!=GeneratorStatus.ContainersGenerated)
return;
for (int i = 0; i < _viewModel.Events.Count; i++)
{
var item = (ListBoxItem)_events.ItemContainerGenerator.ContainerFromIndex(i);
if (item == null)
continue;
var textBlock = item.FindByName("ActualText");
var eventViewModel = (EventViewModel)textBlock.DataContext;
var path = eventViewModel.BindingPath;
var binding = new Binding(path) { Source = eventViewModel };
textBlock.SetBinding(TextBlock.TextProperty, binding);
}
}
如果您只需要设置单个项目的绑定,则代码会简单得多。
<TextBlock x:Name="_text" Name="ActualText" />
在代码后台:
var binding = new Binding(path) { Source = bindingSourceObject };
_text.SetBinding(TextBlock.TextProperty, binding);
希望这能帮助到某个人。