WPF: привязка данных ListView в UserControl не показывает элементов - PullRequest
1 голос
/ 20 апреля 2011

Я почти уверен, что это проблема UserControl DataContext, но я просто не вижу ее:

Это мой XAML:

<UserControl x:Class="WFT.Controls.DetailsBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:wft="clr-namespace:WFT.Controls" >

    <wft:CaptionedBox Caption="Details" Margin="1" >
        <ListView ItemsSource="{Binding Map}">
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding Key}"  />
                    <GridViewColumn DisplayMemberBinding="{Binding Value}" />
                </GridView>
            </ListView.View>
        </ListView>
    </wft:CaptionedBox>
</UserControl>

Это код позади:

public partial class DetailsBox : UserControl
{
    ObservableCollection<KeyValuePair<string, string>> m_Map =
        new ObservableCollection<KeyValuePair<string, string>>( );

    public ObservableCollection<KeyValuePair<string, string>> Map
    { get { return m_Map; } }

    public DetailsBox( )
    {
        InitializeComponent( );
        DataContext = this;
    }

    public void Initialize( List<string> map )
    {
        IEnumerable<int> range = Enumerable.Range( 0, map.Count );

        m_Map = new ObservableCollection<KeyValuePair<string, string>>(
            range.Where( r => 0 == r % 2 && map[ r + 1 ].Trim( ) != "N/A" )
            .Select( r => new KeyValuePair<string, string>( map[ r ], map[ r + 1 ] ) ).ToList( ) );

    }
}

Во время выполнения Map содержит восемь элементов, но в ListView ничего не отображается. В автономном тестовом приложении оно работает с DataContext="{Binding RelativeSource={RelativeSource Self}}", но в качестве UserControl это не сработало. Я даже прибегнул, как вы видите выше, к попытке установить DataContext = this в конструкторе.

Спасибо!

1 Ответ

0 голосов
/ 25 апреля 2011

Я никогда не понимал, как установить DataContext в XAML, но я заставил себя работать, выполнив следующее:

В XAML я добавил x:Name="listview" в ListView.

Затем в коде я превратил свойство Map в свойство DependencyProperty

public ObservableCollection<KeyValuePair<string, string>> Map
{
    get { return (ObservableCollection<KeyValuePair<string, string>>)GetValue( MapProperty ); }
    set { SetValue( MapProperty, value ); }
} 

public static DependencyProperty MapProperty = DependencyProperty.Register( "Map",
     typeof( ObservableCollection<KeyValuePair<string, string>> ), 
     typeof( DetailsBox ),
     new PropertyMetadata( new ObservableCollection<KeyValuePair<string, string>>( ) ) );

удалено DataContext = this; из конструктора и добавлено listview.DataContext = Map; в Initialize после загрузки Map.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...