我无法绑定到我的ListBox中的ObservableCollection<T>
。
我正在使用MVVM,WPF。
页面的绑定有效。我的理解是,Grid(未在代码中显示)绑定到我的DataContext
,这是我的ViewModel。因此,我的ListBox
可以通过Itemssource
绑定到名为Folders的对象。我的文件夹对象非常简单,它实际上是
private ObservableCollection<Folders> _folders;
public ObservableCollection<Folders> Folders
{
get { return _folders; }
set
{
if (value == _folders)
return;
_folders = value;
OnPropertyChanged("Folders");
}
}
我的文件夹模型是
public class Folders
{
public string SourceFolder { get; set; }
public string DestinationFolder { get; set; }
}
最后,我的XAML
<ListBox Grid.RowSpan="2" ItemsSource="{Binding Folders, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" SelectedItem="{Binding SelectedFolderItem}" IsSynchronizedWithCurrentItem="True">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}, AncestorLevel=1}, Path=DataContext}">
<StackPanel>
<TextBlock Text="{Binding SourceFolder}" />
<TextBlock Text="{Binding DestinationFolder}" />
<Button Content="Edit" Command="{Binding EditCommand}" CommandParameter="{Binding SelectedListItem}"/>
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
按钮绑定/执行,但2个文本块不绑定/执行。我也试过
<TextBlock Text="{Binding Folders.SourceFolder}" />
<TextBlock Text="{Binding Folders.DestinationFolder}" />
但是同样的问题。内容不显示(不绑定),因为如果我在ViewModel上添加一个监视,我可以看到它们应该是这样的。
如果有帮助,请将代码更新为
<TextBlock Text="{Binding SelectedFolderItem.SourceFolder}" />
<TextBlock Text="{Binding SelectedFolderItem.DestinationFolder}" />
然后它可以工作,虽然这不是所希望的(它只是循环正确的次数,但仅适用于1项!)。
有人可以指出我正确的方向吗?
答案 0 :(得分:3)
您正在设置不同的DataContext。您不需要,否则会破坏项目模板的用途。
<StackPanel Orientation="Horizontal">
<StackPanel>
<TextBlock Text="{Binding SourceFolder}" />
<TextBlock Text="{Binding DestinationFolder}" />
<Button Content="Edit"
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=DataContext.EditCommand}"
CommandParameter="{Binding}"/>
</StackPanel>
</StackPanel>
当然,如果你想让按钮工作,你只需将你当前拥有的相对来源移动到按钮的绑定。