c# - WPF 绑定(bind) ObservableCollection<string> 到 ItemsControl 不起作用

标签 c# wpf data-binding observablecollection itemscontrol

我有一些字符串属性,需要解析内容并将其显示在单独的控件中。假设有由空格分隔的电子邮件和网址。显示电子邮件工作正常,但网址不行。代码如下:

XAML 文件:

<ScrollViewer Grid.Row="0" Grid.Column="5" >
        <StackPanel Orientation="Vertical">
            <TextBox Name="EmailTextBox"
                     Text="{Binding ElementName=candidatePersonalDataViewControl, Mode=OneWay, Path=Candidate.Email, Converter={StaticResource emailConverter}}"/>

            <ItemsControl ItemsSource="{Binding ElementName=candidatePersonalDataViewControl, Mode=OneWay, Path=UrlsProperty}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock
                            Margin="0,0,0,0"
                            Padding="5,2,5,2"
                            HorizontalAlignment="Left"
                            VerticalAlignment="Top">
                            <Hyperlink NavigateUri="{Binding Path=/}" 
                                       Click="EmailAsWWW_Click">
                                <Run Text="{Binding Path=/}" />
                            </Hyperlink>
                        </TextBlock>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel Orientation="Vertical" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </StackPanel>
    </ScrollViewer>

C# 文件:

    private static readonly DependencyProperty CandidateProperty = DependencyProperty.Register("Candidate", typeof(Candidate), typeof(CandidatePersonalDataViewControl));
    public Candidate Candidate
    {
        get { return (Candidate)GetValue(CandidateProperty); }
        set { SetValue(CandidateProperty, value); }
    }

    public CandidatePersonalDataViewControl()
    {
        InitializeComponent();
        this.DataContext = this;
        UrlsProperty = new ObservableCollection<string>();
    }

    public ObservableCollection<string> UrlsProperty
    {
        get;
        private set;
    }

    private void Grid_LayoutUpdated(object sender, EventArgs e)
    {
        if (Candidate == null)
            return;
        if (Candidate.Email == null)
            return;


        EmailPropertyToEmailsConverter emailConverter = new EmailPropertyToEmailsConverter();
        bool emails = (emailConverter.Convert(Candidate.Email, typeof(string), null, null) as string) != null;
        this.EmailTextBox.Visibility = emails ? Visibility.Visible : Visibility.Collapsed;

        EmailPropertyToUrlListConverter urlConverter = new EmailPropertyToUrlListConverter();
        IList<string> urls = urlConverter.Convert(Candidate.Email, typeof(string), null, null) as IList<string>;
        UrlsProperty.Clear();
        if (urls != null)
            foreach (string url in urls)
                UrlsProperty.Add(url);
    }

我已经调试了 Grid_LayoutUpdated 并且它工作正常。它会在需要时被触发,并且 UrlsCollection 包含所需的数据。正如我所说,EmailTextBox 显示数据,但 ItemsControl 始终为空。更有趣的是,从超链接绑定(bind)中删除“Path=/”会引发 XAML 解析异常。我已经没有想法了... 我读过一些主题,但没有一个有帮助

wpf ItemsControl binding problem

WPF Binding Path=/ not working?

WPF - bind a listbox to a list<string> - what am I doing wrong?

How do you bind ObservableCollections to ItemsSource?

最佳答案

Path=/ 绑定(bind)到集合的当前项目,而不是正在模板化的当前项目 ,通常表示当前项目是选定的项目(参见 IsSynchronizedWithCurrentItem )。您的 DataContext 是字符串而不是集合,因此尝试通过 / 绑定(bind)到当前项目将会失败(请参阅 binding errors )。

要绑定(bind)到正在模板化的当前项目,您需要直接绑定(bind)到DataContext,这可以通过{Binding}来完成或 {Binding .}/{Binding Path=.} (如果属性需要 Binding.Path,请选择后者之一)。

关于c# - WPF 绑定(bind) ObservableCollection<string> 到 ItemsControl 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12317682/

相关文章:

c# - 为额外信息创建通用类成员

c# - 将数据从数据层获取到 View 中的 observablecollection

.net - Keyboard.Focus(item) 和 item.Focus() 有什么区别?

wpf - 您可以在 DataTemplate 中使用 CollectionViewSource 吗?

c# - INotifyPropertyChanged 的​​ PropertyChanged 成员始终为 null

c# - 信号量异常 - 将指定的计数添加到信号量会导致它超过其最大计数

c# - 使用 IoC 进行生产和测试的最佳方式

c# - 在WinForms中显示,覆盖和解释实时视频提要

c# - WPF RichTextBox 自动换行

c# - WPF 自定义文本框控件未正确绑定(bind)文本