Wpf 绑定到列表中的当前项

Wpf 绑定到列表中的当前项,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="{

我这里有这个xaml

<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 { }
}