C# WPF绑定可观察收集<;字符串>;至ItemsControl不工作

C# WPF绑定可观察收集<;字符串>;至ItemsControl不工作,c#,wpf,data-binding,observablecollection,itemscontrol,C#,Wpf,Data Binding,Observablecollection,Itemscontrol,我有一些字符串属性,内容需要解析,并显示在单独的控件中。假设电子邮件和URL之间有空格。显示电子邮件很好,但URL不行。以下是代码: XAML文件: C#文件: private static readonly dependencProperty CandidateProperty=dependencProperty.Register(“Candidate”、typeof(Candidate)、typeof(CandidatePersonalDataViewControl)); 公开候选人 {

我有一些字符串属性,内容需要解析,并显示在单独的控件中。假设电子邮件和URL之间有空格。显示电子邮件很好,但URL不行。以下是代码:

XAML文件:


C#文件:

private static readonly dependencProperty CandidateProperty=dependencProperty.Register(“Candidate”、typeof(Candidate)、typeof(CandidatePersonalDataViewControl));
公开候选人
{
获取{return(Candidate)GetValue(CandidateProperty);}
set{SetValue(CandidateProperty,value);}
}
public CandidatePersonalDataViewControl()
{
初始化组件();
this.DataContext=this;
UrlsProperty=新的ObservableCollection();
}
公共可观测集合UrlsProperty
{
收到
私人设置;
}
私有无效网格\u布局已更新(对象发送方,事件参数e)
{
if(候选者==null)
回来
if(Candidate.Email==null)
回来
EmailPropertyToEmailsConverter emailConverter=新的EmailPropertyToEmailsConverter();
bool emails=(emailConverter.Convert(Candidate.Email,typeof(string),null,null)作为字符串)!=null;
this.EmailTextBox.Visibility=电子邮件?可见性。可见:可见性。折叠;
EmailPropertyToUrlListConverter urlConverter=新的EmailPropertyToUrlListConverter();
IList URL=urlConverter.Convert(Candidate.Email,typeof(string),null,null)作为IList;
UrlsProperty.Clear();
如果(URL!=null)
foreach(url中的字符串url)
UrlsProperty.Add(url);
}

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

试试:

<Hyperlink NavigateUri="{Binding}" Click="EmailAsWWW_Click">
    <Run Text="{Binding}" />
</Hyperlink>

试试:


您的超链接控件需要NavigateUri属性的Uri,但您只需绑定到字符串即可

实现所需的一种方法是为NavigateUri绑定使用转换器

<Hyperlink NavigateUri="{Binding Path=., Converter={StaticResource YourStringToUriConverterGoesHere}}" Click="EmailAsWWW_Click">
  <Run Text="{Binding}" />
</Hyperlink>

另一种方法是更改集合

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

public class MyUrlWrapper
{
    public string Url {get;set;}
    public Uri MyUri {get{return new Uri(this.Url);}}
}

<Hyperlink NavigateUri="{Binding Path=MyUri}" Click="EmailAsWWW_Click">
  <Run Text="{Binding Path=Url}" />
</Hyperlink>
public ObservableCollection URL属性
{
收到
私人设置;
}
公共类MyUrlWrapper
{
公共字符串Url{get;set;}
公共Uri MyUri{get{返回新Uri(this.Url);}
}

您的超链接控件需要NavigateUri属性的Uri,但您只需绑定到字符串即可

实现所需的一种方法是为NavigateUri绑定使用转换器

<Hyperlink NavigateUri="{Binding Path=., Converter={StaticResource YourStringToUriConverterGoesHere}}" Click="EmailAsWWW_Click">
  <Run Text="{Binding}" />
</Hyperlink>

另一种方法是更改集合

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

public class MyUrlWrapper
{
    public string Url {get;set;}
    public Uri MyUri {get{return new Uri(this.Url);}}
}

<Hyperlink NavigateUri="{Binding Path=MyUri}" Click="EmailAsWWW_Click">
  <Run Text="{Binding Path=Url}" />
</Hyperlink>
public ObservableCollection URL属性
{
收到
私人设置;
}
公共类MyUrlWrapper
{
公共字符串Url{get;set;}
公共Uri MyUri{get{返回新Uri(this.Url);}
}

路径=/
绑定到集合的当前项而不是正在模板化的当前项,通常所说的当前项是选中的项(请参阅)。您的
DataContext
是字符串而不是集合,因此尝试通过
/
绑定到当前项将失败(请参阅)


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

路径=/
绑定到集合的当前项而不是正在模板化的当前项,通常说当前项是已选择的项(请参阅)。您的
DataContext
是字符串而不是集合,因此尝试通过
/
绑定到当前项将失败(请参阅)


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

更有趣的是,删除“Path=/”从超链接绑定引发XAML解析异常。更有趣的是,从超链接绑定中删除“Path=/”会引发XAML解析异常。已检查但没有帮助:(我相信这不是问题。我以前使用过没有转换器的Hyerplink,它工作得很好。无论如何感谢您的回复。请尝试:只是看看集合不是空的,绑定是正确的。还有一件事-输出窗口中是否有绑定错误?您也可以使用Snoop检查绑定错误。已检查但没有帮助:(我相信这不是问题。我以前使用过没有转换器的Hyerplink,它工作得很好。无论如何感谢您的回复。请尝试:只是看看集合不是空的,绑定是正确的。还有一件事-输出窗口中是否有绑定错误?您也可以使用Snoop检查绑定错误。