コンテンツを解析して別のコントロールに表示する必要がある文字列プロパティがあります。空白で区切られた電子メールとURLがあるとしましょう。メールの表示は正常に機能しますが、URLは機能しません。コードは次のとおりです。
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は常に空です。さらに興味深いことに、ハイパーリンクバインディングから「Path = /」を削除すると、XAML解析例外が発生します。アイデアが足りなくなりました...いくつかのトピックを読みましたが、どれも役に立ちませんでした