WPF绑定不适用于ItemsControl

时间:2018-02-16 14:13:33

标签: c# wpf dependency-properties

我正在尝试将依赖项属性绑定到另一个属性,但它似乎不起作用。我在另一个ItemsControl中有一个ItemsControl:

<!--This is an itemscontrol in BigBox.xaml that contains bins-->
        <ItemsControl
            x:Name="ctrlBin"
            Grid.Column="1"
            Grid.Row="1"
            ItemsPanel="{StaticResource HorizontalStackPanel}"
            ItemsSource="{Binding Bins}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ItemsControl 
                    ItemsSource="{Binding}"
                    ItemContainerStyle="{StaticResource BinViewContainer}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <local:BinView
                                x:Name="ctrlBin"
                                BorderBrush="Black"
                                BorderThickness="1"
                                Bin="{Binding}"
                                BinFlashStart="{Binding DashboardFlashStart}"/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
        </ItemsControl>

这是我的BigBox&#39;

        private bool? m_DashboardFlashStart;
        public bool? DashboardFlashStart
        {
            get=> m_DashboardFlashStart;
            set => Set(ref m_DashboardFlashStart, value);
        }

这是我的BinView

        //This is in the BinView.xaml.cs 
    public static DependencyProperty BinFlashStartProperty =
        DependencyProperty.Register(
            "BinFlashStart",
            typeof(bool?),
            typeof(BinView),
            new PropertyMetadata(null, OnBinFlashStartSet));

    private static void OnBinFlashStartSet(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        BinVM Bin = ((BinView)sender).m_BinVM;
        Bin.CurBin.FlashBin = (bool?)e.NewValue;
    }

    public bool? BinFlashStart
    {
        get => (bool?) GetValue(BinFlashStartProperty);
        set => SetValue(BinFlashStartProperty, value);
    }

我得到了一个错误

System.Windows.Data Error: 40 : BindingExpression path error: 'DashboardFlashStart' property not found on 'object' ''Bin' (HashCode=-125066214)'. BindingExpression:Path=DashboardFlashStart; DataItem='Bin' (HashCode=-125066214); target element is 'BinView' (Name=''); target property is 'BinFlashStart' (type 'Nullable`1')

为什么要在&#39; Bin&#39;上寻找DashboardFlashStart属性。我认为这是BigBox的来源。 就像我把静态值&#34; True&#34;在BigBox.xaml中为BinFlashStart而不是绑定然后工作。为什么我无法绑定到BigBox的DashboardFlashStart。

如果有人可以解释发生了什么,那将非常有帮助。 我是这个WPF的新手。

2 个答案:

答案 0 :(得分:1)

您的控件正在其的datacontext中查找名为DashboardFlashStart的属性。但该物业不在&#34; Bin&#34;但是在BigBox中,所以你需要做的是为这个绑定指定绑定到bigbox datacontext的源。

更改您的约束BinFlashStart="{Binding DashboardFlashStart}"

有这样的东西

{Binding DataContext.DashboardFlashStart, ElementName=ctrlBin}"

答案 1 :(得分:1)

如果在BigBox类的代码隐藏中定义了BigBox.xaml.cs属性,即在BinFlashStart="{Binding DashboardFlashStart, RelativeSource={RelativeSource AncestorType=local:BigBox}}"/> 中,这应该可以工作:

DeviceTrackerHistoryModel.getAggregation = (query) => {
    return DeviceTrackerHistoryModel.aggregate(query);
}