1

だから私はここにこの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>

DependencyPropertyそして、と呼ばれるUserControlPackage

私がやろうとしているのは、そのプロパティをリストの現在のアイテムに設定することです。私はこれに約1時間いますが、何が間違っているのかわかりません。

私が上に持っている現在のコードFirstChanceException

BindingExpression path error: '' property not found on 'current item of collection' ''FeedGame' (Name='Me')'. BindingExpression:Path=/; DataItem='FeedGame' (Name='Me'); target element is 'FeedGame' (Name='Me'); target property is 'Package' (type 'IPackage')

そして、あなたが何でMeあるか興味があるなら、これはUserControlのxamlにあります上記のリストボックスはに含まれています

x:Name="Me"
DataContext="{Binding ElementName=Me}"

これはFeedGame

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");
    }
}
4

1 に答える 1

0

GetValuePackageを設定するときに、バインディングエンジンが直接(SetおよびSetValueGetプロパティをバイパスして)呼び出すため、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:

<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 { }
}
于 2013-03-26T02:55:55.133 に答える