WPF - не удается отобразить ObservableCollection в окне - PullRequest
0 голосов
/ 09 января 2010

У меня есть коллекция ObservableCollection, которую я не могу отобразить в окне. Вот код:

Модель просмотра:

public class QueryParamsVM : DependencyObject
{
    public string Query { get; set; }

    public QueryParamsVM()
    {
        Parameters = new ObservableCollection<StringPair>();
    }

    public ObservableCollection<StringPair> Parameters
    {
        get { return (ObservableCollection<StringPair>)GetValue(ParametersProperty); }
        set { SetValue(ParametersProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Parameters.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ParametersProperty =
        DependencyProperty.Register("Parameters", typeof(ObservableCollection<StringPair>), typeof(QueryParamsVM), new UIPropertyMetadata(null));
}


public class StringPair: INotifyPropertyChanged
{
    public string Key { get; set; }
    public string Value
    {
        get { return _value; }
        set { _value = value; OnPropertyChanged("IsVisible"); }
    }
    private string _value;

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

Окно xaml:

<Window x:Class="WIAssistant.QueryParams"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Query Parameters" Height="390" Width="504">

    <Grid>
        <ListBox DataContext="{Binding Parameters}" >

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Key}"  ></TextBlock>
                        <TextBlock Text="{Binding Value}"></TextBlock>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>        
    </Grid>
</Window>

Телефонный код:

 // Get Project Parameters
 QueryParams queryParams = new QueryParams();
 queryParams.ViewModel.Parameters.Add(new StringPair {Key = "@project", Value = ""});
 queryParams.ShowDialog();

Я попытался поместить отладочные операторы в привязки. Параметр привязывается к, но привязка значения никогда не вызывается.

Есть идеи о том, как отобразить мой список?

Ответы [ 2 ]

3 голосов
/ 09 января 2010

Попробуйте

<ListBox ItemsSource="{Binding Parameters}">

или

<ListBox DataContext="{Binding Parameters}" ItemsSource="{Binding}">
1 голос
/ 09 января 2010

Что-то странное здесь:

public string Value
{
    get { return _value; }
    set { _value = value; OnPropertyChanged("IsVisible"); }
}

Вы вызываете событие изменения свойства для другого свойства. Вероятно, должно быть:

public string Value
{
    get { return _value; }
    set { _value = value; OnPropertyChanged("Value"); }
}
...