C# WPF绑定可观察收集<;字符串>;至ItemsControl不工作
我有一些字符串属性,内容需要解析,并显示在单独的控件中。假设电子邮件和URL之间有空格。显示电子邮件很好,但URL不行。以下是代码: XAML文件: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)); 公开候选人 {
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检查绑定错误。