У меня есть следующий контент в Window ( удалены ненужные разделы ):

XAML:

<Style x:Key="itemstyle" TargetType="{x:Type ContentPresenter}">
        <EventSetter Event="MouseLeftButtonDown" Handler="HandleItemClick"/>
</Style>

<ItemsControl ItemsSource="{Binding ArtistList}" Margin="10" Name="artist_list" ItemContainerStyle="{StaticResource itemstyle}" >
    <ItemsControl.ItemTemplate>
        <DataTemplate>
                <TextBlock Text="{Binding ID}" Foreground="White"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

<Controls:RSSViewer x:Name="rssControl" />

C # ( Отложенный код ):

private void HandleItemClick(object sender, MouseButtonEventArgs e)
{
    var selectedArtist = ((ContentPresenter) sender).Content as Artist;
    rssControl.SourceUrl = "http://agnt666laptop:28666/rss.aspx?artistid=" + selectedArtist.ID;
}

Теперь я хочу преобразовать указанную выше смесь xaml и C # во что-то, что является исключительно xaml, чтобы воспользоваться преимуществами модели DataBinding WPF.

Я думаю, что для этого требуется что-то вроде триггера события и комбинации привязки данных с выбранным элементом элемента itemscontrol или что-то в этом роде, но я не уверен, как это сделать.

Может ли кто-нибудь подсказать мне, как преобразовать указанное выше решение для удаления процедурного кода?

1
Andreas Grech 16 Май 2009 в 18:27

2 ответа

Лучший ответ
<ItemsControl ItemsSource="{Binding ArtistList}" Margin="10" Name="artist_list" ItemContainerStyle="{StaticResource itemstyle}" >
        <ItemsControl.ItemTemplate>
                <DataTemplate>
                                <TextBlock Text="{Binding ID}" Foreground="White"/>
                </DataTemplate>
        </ItemsControl.ItemTemplate>
</ItemsControl>

<Controls:RSSViewer x:Name="rssControl" SourceUrl="{Binding SelectedItem.ID, ElementName=artist_list, StringFormat= 'http://agnt666laptop:28666/rss.aspx?artistid={0}' }" />
0
Andreas Grech 17 Май 2009 в 07:23
Не работает: System.Windows.Data Ошибка: 4: не удается найти источник для привязки со ссылкой «ElementName = artist_list». BindingExpression: Путь = SelectedItem.ID; DataItem = null; целевой элемент - RSSViewer (Name = 'rssControl'); целевое свойство - SourceUrl (тип String)
 – 
Andreas Grech
17 Май 2009 в 07:23
Я не думаю, что ItemsControl имеет свойство SelectedItems. Если вам нужен выбор, вам нужно использовать ListBox или ListView.
 – 
Andy
17 Май 2009 в 07:38
Энди прав, ItemsControl не имеет свойства SelectedItem ... поэтому мы должны сделать это по-другому, тогда
 – 
Andreas Grech
17 Май 2009 в 07:46
Да, верно ... вы можете использовать Selector вместо ItemsControl
 – 
Thomas Levesque
17 Май 2009 в 16:51