1

我有一个包含网格的自定义 UserControl ...我希望ItemsSource通过资源字典中数据模板的 xaml 代码设置该网格的属性...然后我使用了依赖属性...这是我的实现。 ..

public partial class MyControlGrid : UserControl
{

    // Dependency Property
    public static readonly DependencyProperty MyItemSourceProperty =
         DependencyProperty.Register("MyItemSource", typeof(ICollectionView),
         typeof(MyControlGrid), new FrameworkPropertyMetadata(null, OnMyItemSourcePropertyChanged));      

    IDictionary<string, string> _columns = new Dictionary<string, string>();


    private static void OnMyItemSourcePropertyChanged(DependencyObject obj, 
        DependencyPropertyChangedEventArgs args)
    {
        // When the color changes, set the icon color PlayButton
        MyControlGrid muc = (MyControlGrid)obj;
        ICollectionView value = (ICollectionView)args.NewValue;
        if (value != null)
        {
            muc.MyGridControl.ItemsSource = value;
        }
    }

    public ICollectionView MyItemSource
    {
        get
        {
            return (ICollectionView)GetValue(MyItemSourceProperty);
        }
        set
        {
            SetValue(MyItemSourceProperty, value);
            //OnTargetPowerChanged(this, new DependencyPropertyChangedEventArgs(TargetPowerProperty, value, value));
            // Old value irrelevant.
        }
    }


    public MyControlGrid()
    {
        InitializeComponent();


    }
}

这是用户控件 xaml 代码

<UserControl x:Class="GUI.Design.Templates.MyControlGrid"
    Name="MyListControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfTkit="http://schemas.microsoft.com/wpf/2008/toolkit"
             xmlns:Templates="clr-namespace:Emule.GUI.Design.Templates">

<StackPanel>

        <WpfTkit:DataGrid   ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Templates:MyControlGrid}}, Path=MyItemSource}"
                            x:Name="MyGridControl"  

<StackPanel>

这是我使用的绑定路径表达式

<basic:MyControlGrid MyItemSource="{Binding MyDataContextVisibleCollection}"/>

这不起作用,wpf 输出窗口不显示任何错误

请注意,自然地,如果我直接在用户控件中绑定它可以正常工作

<WpfTkit:DataGrid   ItemsSource="{Binding MyDataContextVisibleCollection}"

我错了吗?

谢谢

ps对不起我的英语

4

1 回答 1

1

这个 答案告诉我方向

使用PropertyChangedCallback我的代码可以正常工作:

public static readonly DependencyProperty MyItemSourceProperty =
              DependencyProperty.Register("MyItemSource", typeof(IEnumerable),
              typeof(MyControlGrid), new FrameworkPropertyMetadata(null,
              new PropertyChangedCallback(MyControlGrid.OnItemsSourceChanged)));

或者我必须删除评论OnTargetPowerChanged并触发属性更改事件

set
{
    SetValue(MyItemSourceProperty, value);
    //OnTargetPowerChanged(this, new DependencyPropertyChangedEventArgs(TargetPowerProperty, value, value));
    // Old value irrelevant.
}

正确的

public ICollectionView MyItemSource
{
    get
    {
        return (ICollectionView)GetValue(MyItemSourceProperty);
    }
    set
    {
        SetValue(MyItemSourceProperty, value);
        OnItemsSourceChanged(this, new DependencyPropertyChangedEventArgs(MyItemSourceProperty, value, value));
    }
}
于 2012-05-16T07:23:28.337 回答