Wpf 如何在DataGrid行为中绑定ItemsControl

Wpf 如何在DataGrid行为中绑定ItemsControl,wpf,xaml,wpfdatagrid,itemscontrol,Wpf,Xaml,Wpfdatagrid,Itemscontrol,我有一个自定义的垂直滚动条,它是在UserControl.Resources中定义的,它有一个名为“ItemsSelected”的ItemsControl 我要做的是将其绑定到行为DataGridSelectionChanged中的DependencyProperty ItemsControl对象。示例绑定不起作用,但显示了我想要实现的目标。绑定所选项目时我缺少什么 System.Windows.Data错误:4:找不到引用为“ElementName=ItemsSelected”的绑定源。 Bi

我有一个自定义的垂直滚动条,它是在UserControl.Resources中定义的,它有一个名为“ItemsSelected”的ItemsControl

我要做的是将其绑定到行为DataGridSelectionChanged中的DependencyProperty ItemsControl对象。示例绑定不起作用,但显示了我想要实现的目标。绑定所选项目时我缺少什么

System.Windows.Data错误:4:找不到引用为“ElementName=ItemsSelected”的绑定源。 BindingExpression:(无路径); DataItem=null; 目标元素是“DataGridSelectionChanged”(HashCode=43407976); 目标属性为“ItemsControl对象”(类型为“ItemsControl”)


...
...
[编辑]

public static class ScrollBarMarkers
{
    public static readonly DependencyProperty MarkersSelectedCollectionProperty =
        DependencyProperty.RegisterAttached("MarkersSelectedCollection", typeof(ObservableCollection<double>), typeof(ScrollBarMarkers), new PropertyMetadata(null));

    public static ObservableCollection<double> GetMarkersSelectedCollection(DependencyObject obj)
    {
        return (ObservableCollection<double>)obj.GetValue(MarkersSelectedCollectionProperty);
    }

    public static void SetMarkersSelectedCollection(ItemsControl obj, ObservableCollection<double> value)
    {
        obj.SetValue(MarkersSelectedCollectionProperty, value);
    }
}
公共静态类滚动条标记
{
公共静态只读从属属性标记SelectedCollectionProperty=
DependencyProperty.RegisterAttached(“MarkersSelectedCollection”、typeof(ObservableCollection)、typeof(ScrollBarMarkers)、new PropertyMetadata(null));
公共静态ObservableCollection GetMarkersSelectedCollection(DependencyObject obj)
{
返回(ObservableCollection)对象GetValue(MarkersSelectedCollectionProperty);
}
公共静态无效集合标记SelectedCollection(ItemsControl对象,ObservableCollection值)
{
对象设置值(标记SelectedCollectionProperty,值);
}
}

实现这样的功能就不再需要绑定实际的ItemsControl

以下是装订:

<ItemsControl ItemsSource="{Binding Source={x:Static helpers:MyClass.Instance}, Path=SelectedMarkers}">

这是一个单例模式的类

public class MyClass : INotifyPropertyChanged
{
    public static ObservableCollection<double> m_selectedMarkers = new ObservableCollection<double>();
    public ObservableCollection<double> SelectedMarkers
    {
        get
        {
            return m_selectedMarkers;
        }
        set
        {
            m_selectedMarkers = value;
            NotifyPropertyChanged();
        }
    }


    private static MyClass m_Instance;
    public static MyClass Instance
    {
        get
        {
            if (m_Instance == null)
            {
                m_Instance = new MyClass();
            }

            return m_Instance;
        }
    }

    private MyClass()
    {
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
}
公共类MyClass:INotifyPropertyChanged
{
公共静态ObservableCollection m_selectedMarkers=新ObservableCollection();
公共可观测集合选定的标记
{
得到
{
返回m_选择的标记;
}
设置
{
m_selectedMarkers=值;
NotifyPropertyChanged();
}
}
私有静态MyClass m_实例;
公共静态MyClass实例
{
得到
{
if(m_实例==null)
{
m_实例=新的MyClass();
}
返回m_实例;
}
}
私有MyClass()
{
}
#区域INotifyProperty更改成员
公共事件属性更改事件处理程序属性更改;
私有void NotifyPropertyChanged([CallerMemberName]字符串propertyName=”“)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
#端区
}

假设您在数据网格中使用此ControlTemplate,这将使ControlTemplate通过绑定填充。我认为您需要在绑定中指定
路径
,即
,不幸的是,出现了相同类型的错误:System.Windows.Data错误:4:无法找到引用为“ElementName=ItemsSelected”的绑定源。BindingExpression:Path=。;DataItem=null;目标元素是“DataGridSelectionChanged”(HashCode=20692948);目标属性是'ItemsControlObject'(类型'ItemsControl')。如果我错了,请纠正我的错误,但我认为绑定在查找实际的
DataContext
,而不是
ItemsSource=“{Binding RelativeSource={RelativeSource FindAncestor,antestortype={x:type UserControl},Path=DataContext.MarkerCollection}”时失败
try
ItemsSource=“{Binding RelativeSource={RelativeSource FindAncestor,antestortype=UserControl},Path=DataContext.MarkerCollection}”
。您可以在这里了解一些信息。MarkerCollection实际上是xmlns:helpers下的DependencyProperty,因此我将其更改为:ItemsSource=“{Binding Path=helpers:MarkerCollection}”,但是获取System.Windows.Data错误:40:BindingExpression路径错误:“helpers:MarkerCollection”属性未在“object”“UsersViewModel”上找到。BindingExpression:Path=helpers:MarkerCollection;DataItem='UsersViewModel';目标元素是“ItemsControl”(名称=“”);目标属性是'ItemsSource'(类型'IEnumerable')。我将把DependencyProperty作为编辑放在问题的底部。刚刚尝试的ItemsSource=“{Binding Path=helpers:ScrollBarMarkers.MarkerCollection}”仍然收到错误消息40
public class MyClass : INotifyPropertyChanged
{
    public static ObservableCollection<double> m_selectedMarkers = new ObservableCollection<double>();
    public ObservableCollection<double> SelectedMarkers
    {
        get
        {
            return m_selectedMarkers;
        }
        set
        {
            m_selectedMarkers = value;
            NotifyPropertyChanged();
        }
    }


    private static MyClass m_Instance;
    public static MyClass Instance
    {
        get
        {
            if (m_Instance == null)
            {
                m_Instance = new MyClass();
            }

            return m_Instance;
        }
    }

    private MyClass()
    {
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
}