【问题标题】:WPF binding does not work for an ItemsControlWPF 绑定不适用于 ItemsControl
【发布时间】:2018-02-16 14:13:32
【问题描述】:

我正在尝试将依赖属性绑定到另一个属性,但它似乎不起作用。我在另一个 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>

这是在我的“大盒子”里

        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')

为什么要在“Bin”上寻找 DashboardFlashStart 属性。我认为这是来自 BigBox 的来源。 就像我在 BigBox.xaml 中为 BinFlashStart 放置一个静态值“True”而不是绑定,那么它就可以工作。为什么我无法绑定到 BigBox 的 DashboardFlashStart。

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

【问题讨论】:

  • DashboardFlashStart 属性到底是在哪里定义的?什么是垃圾箱?
  • @mm8 它在包含 Bins(也是一个 UserControl)的 BigBox(它是一个 UserControl)中定义。我在 Dashboard 应用程序中使用 BigBox 控件并从那里设置 DashboardFlashStart

标签: c# wpf dependency-properties


【解决方案1】:

只要DashboardFlashStart 属性在BigBox 类的代码隐藏中定义,即在BigBox.xaml.cs 中,这应该可以工作:

BinFlashStart="{Binding DashboardFlashStart, RelativeSource={RelativeSource AncestorType=local:BigBox}}"/>

【讨论】:

    【解决方案2】:

    您的控件正在其数据上下文中查找名为 DashboardFlashStart 的属性。但是该属性不在“Bin”类中,而是在 BigBox 中,因此您需要为此绑定指定绑定到 bigbox 数据上下文的源。

    更改您的绑定BinFlashStart="{Binding DashboardFlashStart}"

    这样的事情

    {Binding DataContext.DashboardFlashStart, ElementName=ctrlBin}"
    

    【讨论】:

    • 试过了,然后给了我以下错误:System.Windows.Data 错误:4:找不到引用'ElementName = ctrlBin'的绑定源。 BindingExpression:Path=DataContext.DashboardFlashStart;数据项=空;目标元素是'BinView'(名称='ctrlBin');目标属性是'BinFlashStart'(类型'Nullable`1')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    相关资源
    最近更新 更多