2

コンテンツを解析して別のコントロールに表示する必要がある文字列プロパティがあります。空白で区切られた電子メールと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解析例外が発生します。アイデアが足りなくなりました...いくつかのトピックを読みましたが、どれも役に立ちませんでした

wpfItemsControlのバインドの問題

WPFバインディングパス=/機能していませんか?

WPF-リストボックスをlist<string>にバインドします-何が間違っていますか?

ObservableCollectionsをItemsSourceにどのようにバインドしますか?

4

3 に答える 3

3

Path=/テンプレート化されている現在のアイテムではなく、コレクションの現在のアイテムにバインドします。通常、現在のアイテムは選択されているアイテムです(を参照)。あなたは文字列であり、コレクションではないため、を介して現在のアイテムにバインドしようとすると失敗します(バインドエラーを参照)。IsSynchronizedWithCurrentItemDataContext/

テンプレート化されている現在のアイテムにバインドするには、または/DataContextを介して実行できるに直接バインドする必要があります(プロパティで後者のいずれかを選択する必要がある場合)。{Binding}{Binding .}{Binding Path=.}Binding.Path

于 2012-09-07T13:33:42.047 に答える
1

ハイパーリンクコントロールにはNavigateUriプロパティのURIが必要ですが、文字列にバインドするだけです。

目的を達成する1つの方法は、NavigateUriバインディングにコンバーターを使用することです。

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

もう1つの方法は、コレクションを変更することです

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>
于 2012-09-07T12:33:39.647 に答える
0

試す:

<Hyperlink NavigateUri="{Binding}" Click="EmailAsWWW_Click">
    <Run Text="{Binding}" />
</Hyperlink>
于 2012-09-07T12:10:31.827 に答える