0

好吧,我就是不明白。请告诉我为什么我的 ListBox 中没有任何项目(现在应该是两个字符串“empty”和“stuff”):

XAML:

<Window.DataContext>
    <Windows:SettingsWindowModel x:Name="model"/>
</Window.DataContext>

<Window.Resources>
    <DataTemplate x:Key="ListItemTemplate">
        <ListBoxItem Content="{Binding}"  />
    </DataTemplate>
</Window.Resources>

<ListBox Name="listBoxActivities" SelectionChanged="ListBoxActivitiesSelectionChanged"
 ItemsSource="{Binding Path=IgnoredActivities}"
 HorizontalAlignment="Left" VerticalAlignment="Top" MinHeight="40" MinWidth="200"
 Padding="5,100,5,0" Height="100" Margin="0,207,0,0" ItemTemplate="{StaticResource ListItemTemplate}" />

在设置窗口模型中:

    private ObservableCollection<String> _ignoredActivities;
    public ObservableCollection<String> IgnoredActivities
    {
        get
        {
            if (_ignoredActivities == null)
            {
                // empty
                _ignoredActivities = new ObservableCollection<String>() { "empty","stuff" };
            }
            return _ignoredActivities;
        }
    }

还有什么需要知道的吗?我忘记了什么?

编辑:也许我应该补充一点,VisualStudio + ReSharper 也没有显示下划线和编译错误。甚至没有警告。

4

6 回答 6

1

对不起,数据一直都在那里。问题在于视觉细节。填充也应用于 ListBox(或项目)的子容器,因此项目不在列表顶部。因为我在 ListBox 上只有一个高度,所以项目总是低于 ListBox 的可见高度。调试的东西。无论如何感谢您的回答!

于 2012-12-03T08:28:06.400 回答
0

1)您不需要设置 DataTemplate

2)你确定视图的DataContext(aaaaa.xaml.cs)是ViewModel(bbbbb.cs,包含IgnoredActivities)吗?

它应该是这样的:

aaaaa.xaml:

<ListBox ItemsSource="{Binding IgnoredActivities}" />

aaaaa.xaml.cs:

public partial class aaaaa : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new bbbbb();
    }
}

bbbbb.cs:

    public class bbbbb : INotifyPropertyChanged
    {
        public bbbbb()
        {
            IgnoredActivities.Add("empty");
            IgnoredActivities.Add("stuff");
        }

        private ObservableCollection<String> _ignoredActivities;
        public ObservableCollection<String> IgnoredActivities
        {
            get
            {
                if (_ignoredActivities == null)
                {
                    // empty
                    _ignoredActivities = new ObservableCollection<String>() { "empty","stuff" };
                }
                return _ignoredActivities;
            }
        }

            #region INotifyPropertyChanged Members

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

            #endregion
    }
}
于 2012-11-30T15:25:10.230 回答
0

使用此语句,您将绑定到 Window 名为“model”的控件中的属性“IgnoredActivities”。

ItemsSource="{Binding ElementName=model, Path=IgnoredActivities}"

使用 ViewModel 时,将它们设置为控件的 DataContext:

<ListBox ItemsSource="{Binding IgnoredActivities}">
    <ListBox.DataContext>
        <local:MyViewModel/>
    </ListBox.DataContext>        
</ListBox>

未指定源的绑定 ("{Binding PathToMyPropert}") 默认为控件的 DataContext,它是从父控件继承的。因此,在您的情况下,您可以将 ViewModel 设置为 Window 的 DataContext ,以便其所有子级都可以使用它:

<Window>
    <Window.DataContext>
        <local:MyViewModel/>
    </Window.DataContext>        

    <ListBox ItemsSource="{Binding IgnoredActivities}"/>    
</Window>
于 2012-11-30T15:27:01.443 回答
0

摆脱那个ElementName绑定属性。它用于绑定到 WPF 控件。简单设置ItemsSource={Binding IgnoredActivities}

于 2012-11-30T15:51:32.140 回答
0

尝试如下:

<ItemsControl ItemsSource="{Binding Path=IgnoredActivities}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <ListBox />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
       <DataTemplate>
           <ListBoxItem Content="{Binding}"  />
       </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
于 2012-11-30T16:12:43.607 回答
0

还尝试在后面的代码中为控件设置 DataContext。

Xaml       - <ListBox Name="myListBox" ItemsSource="{Binding IgnoredActivities}"/>    
CodeBehind - myListBox.DataContext=this;
于 2012-12-03T02:32:26.177 回答