Wpf 绑定到列表中的当前项
我这里有这个xamlWpf 绑定到列表中的当前项,wpf,data-binding,Wpf,Data Binding,我这里有这个xaml <ListBox Grid.Column="1" Grid.Row="1" Background="Transparent" ItemsSource="{Binding Packages}"> <ListBox.ItemTemplate> <DataTemplate> <gameManagement:FeedGame DataContext="{Binding}" Package="{
<ListBox Grid.Column="1" Grid.Row="1" Background="Transparent" ItemsSource="{Binding Packages}">
<ListBox.ItemTemplate>
<DataTemplate>
<gameManagement:FeedGame DataContext="{Binding}" Package="{Binding Path=/}"></gameManagement:FeedGame>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
如果你想知道Me是什么,这是UserControl的xaml,上面的列表框包含在其中
x:Name="Me"
DataContext="{Binding ElementName=Me}"
这是在游戏中
填充包时不会调用setter,因为绑定引擎直接绕过属性集和get调用GetValue和SetValue 如果需要在setter中执行一些逻辑操作,并且正在使用绑定,则可以使用PropertyChangedCallback 例如:
public static readonly DependencyProperty PackageProperty = DependencyProperty.Register(
"Package", typeof(IPackage), typeof(FeedGame), new UIPropertyMetadata(null, new PropertyChangedCallback(OnPackageChanged)));
// callback when value changed
private static void OnPackageChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (Equals(e.OldValue, e.NewValue))
{
return;
}
}
public IPackage Package
{
get { return (IPackage)this.GetValue(PackageProperty); }
set { SetValue(PackageProperty, value); }
}
编辑:
我的测试
Xaml:
代码:
我认为is应该是``实际上我也这么认为,但我猜{Binding}指的是整个集合。不,它将是包,因为您在ItemTemplate中,它将是列表中的单个项。Hm。我从……那里得到了关于……的信息。但是,照你说的做并没有什么帮助,因为包的setter从来没有被调用过。哦,天哪,这是说当前选定项,而不是当前迭代项。不管怎样,我仍然没有得到任何结果:\。事实上,这仍然没有帮助。OnPackageChanged也从未接到呼叫。但我的列表最后有两项,因此我知道数据源正在输出数据。hmmm。。我做了一个简单的例子,效果很好,你想让我在这里发布吗?实际上,我可以推动我的更改。我正在github上开发一个开源应用,如果你不介意看一眼的话?在上下文中可能更容易发现问题。如果没有示例就可以了。@kelton52,我添加了我的测试,如果您在OnPackageChanged上添加断点,您将看到它被调用。
public static readonly DependencyProperty PackageProperty = DependencyProperty.Register(
"Package", typeof(IPackage), typeof(FeedGame));
public IPackage Package {
get
{
return (IPackage)this.GetValue(PackageProperty);
//return this.package;
}
set
{
// Setter here never gets called.
if (Equals(value, (IPackage)this.GetValue(PackageProperty)))
{
return;
}
SetValue(PackageProperty,value);
this.OnPropertyChanged("Package");
}
}
public static readonly DependencyProperty PackageProperty = DependencyProperty.Register(
"Package", typeof(IPackage), typeof(FeedGame), new UIPropertyMetadata(null, new PropertyChangedCallback(OnPackageChanged)));
// callback when value changed
private static void OnPackageChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (Equals(e.OldValue, e.NewValue))
{
return;
}
}
public IPackage Package
{
get { return (IPackage)this.GetValue(PackageProperty); }
set { SetValue(PackageProperty, value); }
}
<Window x:Class="WpfApplication10.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:WpfApplication10"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="199" Width="191" Name="UI">
<Grid DataContext="{Binding ElementName=UI}">
<ListBox ItemsSource="{Binding Packages}" >
<ListBox.ItemTemplate>
<DataTemplate>
<local:FeedGame Package="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>
namespace WpfApplication10
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Packages.Add(new Package());
Packages.Add(new Package());
Packages.Add(new Package());
}
private ObservableCollection<IPackage> _packages = new ObservableCollection<IPackage>();
public ObservableCollection<IPackage> Packages
{
get { return _packages; }
set { _packages = value; }
}
}
public class FeedGame : FrameworkElement
{
public static readonly DependencyProperty PackageProperty =
DependencyProperty.Register( "Package", typeof(IPackage), typeof(FeedGame)
, new UIPropertyMetadata(null, new PropertyChangedCallback(OnPackageChanged)));
private static void OnPackageChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (Equals(e.OldValue, e.NewValue))
{
return;
}
}
public IPackage Package
{
get { return (IPackage)this.GetValue(PackageProperty); }
set { SetValue(PackageProperty, value); }
}
}
public interface IPackage { }
public class Package : IPackage { }
}