将集合绑定到自定义控件属性

帕特里克

我没有运气试图将数据集合绑定到我的自定义控件的属性。我已经实现了该控件的字符串属性的机制(这里有一点帮助),并期望集合类型一样简单。但是,我无法使其再次工作。

这是我的自定义控件视图

<UserControl x:Class="BadaniaOperacyjne.Controls.Matrix"
            mc:Ignorable="d" Name="CustomMatrix"
            d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Grid.RowDefinitions>
            <!-- ... -->
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <!-- ... -->
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding ElementName=CustomMatrix, Path=Title}"/>
        <Grid Grid.Row="2" Grid.Column="1" Name="contentGrid">
            <ListBox ItemsSource="{Binding ElementName=CustomMatrix, Path=ItemsList}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding}"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </Grid>
    </Grid>
</UserControl>

及其代码背后

#region ItemsList Property
public static readonly DependencyProperty ItemsListProperty =
    DependencyProperty.Register("ItemsList", typeof(ObservableCollection<object>), typeof(Matrix), new PropertyMetadata(new ObservableCollection<object>(), new PropertyChangedCallback(ItemsListChanged)));
public ObservableCollection<object> ItemsList
{
    get { return GetValue(ItemsListProperty) as ObservableCollection<object>; }
    set { SetValue(ItemsListProperty, value); }
}
private void ItemsListChanged(object value)
{
    System.Diagnostics.Debug.WriteLine("matrix: items list changed " + value);
    if (ItemsList != null)
    {
        ItemsList.CollectionChanged += ItemsList_CollectionChanged;
        System.Diagnostics.Debug.WriteLine("got " + string.Join(",", ItemsList.ToList()));
    }
    else
    {
        System.Diagnostics.Debug.WriteLine("got null");
    }
}

void ItemsList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    System.Diagnostics.Debug.WriteLine("matrix: current items list collection changed");
}
private static void ItemsListChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    // a breakpoint
    ((Matrix)d).ItemsListChanged(e.NewValue);
}
#endregion

// showing the Title property implementation just to state that
// it is done the same way as for ItemsList
#region Title Property
public static readonly DependencyProperty TitleProperty = 
    DependencyProperty.Register("Title", typeof(string), typeof(Matrix), new PropertyMetadata("", new PropertyChangedCallback(TitleChanged)));
public string Title
{
    get { return (string)GetValue(TitleProperty); }
    set { SetValue(TitleProperty, value); }
}
private void TitleChanged(string title)
{
    System.Diagnostics.Debug.WriteLine("matrix: title changed to: " + title);
}
private static void TitleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    ((Matrix)d).TitleChanged((string)e.NewValue);
}
#endregion

这就是我试图绑定到该控件的方式

<custom:Matrix x:Name="customMatrix" DockPanel.Dock="Top" Title="{Binding Title}" ItemsList="{Binding Items}"/>

而主页的代码是

//internal ObservableCollection<List<int>> ItemsList { get; set; }
public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public ViewModel()
    {
        Items = new ObservableCollection<int> { 1, 2, 3, 4, 5, 6};
    }

    void Items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("problem manager: items list changed " + e.NewItems.Count);
    }

    public ObservableCollection<int> Items { get; set; }

    protected string title;
    public string Title
    {
        get { return title; }
        set
        {
            if (title != value)
            {
                title = value;
                NotifyPropertyChanged("Title");
            }
        }
    }

    protected void NotifyPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

public ViewModel VM { get; private set; }

// this is the window constructor
private ProblemManager() 
{
    VM = new ViewModel();

    DataContext = VM;
    InitializeComponent();

    VM.Title = "title";
}

private int i = 0;
private void btnAddRow_Click(object sender, RoutedEventArgs e)
{
    // when doing either of these two lines below, 
    // the control breakpoint is never hit
    VM.Items.Add(++i);
    VM.Items = new ObservableCollection<int> { 2, 3 };

    // however, when directly assigning to the control's property, 
    // the event is raised and the breakpoint is hit and the UI is updated
    customMatrix.ItemsList = new ObservableCollection<object> { 1, 2, 3 };
    customMatrix.ItemsList.Add(66);
    // and this of course makes the control's title update
    VM.Title = (++i).ToString();
}

我相信,两者都是DependencyProperty针对控件的,Title并且ItemsList创建方式相同。尽管如此,绑定可能无法正常工作,因为该ItemsListChanged绑定未引发事件。因此,问题在于我无法ViewModel.Items通过XAML将窗口的集合绑定到控件的ItemsList集合。DependencyProperty在控件中为集合创建值DependencyProperty为简单string属性创建值有区别吗?

罗希特·瓦茨

问题出在您的DependencyProperty注册中。Co-variance is not applicable for generic lists也就是说,你不能这样做-

ObservableCollection<object> objects = new ObservableCollection<int>();

您已将DP的类型声明为,ObservableCollection<object>但将其与type列表绑定ObservableCollection<int>

您应该change either type of DP to ObservableCollection<int>OR change binding collection type to ObservableCollection<object>

public ViewModel()
{
    Items = new ObservableCollection<object> { 1, 2, 3, 4, 5, 6};
}

public ObservableCollection<object> Items { get; set; }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将集合绑定到自定义控件属性

来自分类Dev

将属性绑定到自定义控件的另一个属性

来自分类Dev

无法将对象的属性绑定到自定义控件

来自分类Dev

如何将 ObservableCollection 正确绑定到自定义控件属性?

来自分类Dev

WPF自定义控件:将CollectionViewSource绑定到DependencyProperty

来自分类Dev

将自定义类型属性绑定到自定义控件

来自分类Dev

绑定到子自定义控件的控件模板中父用户控件代码中定义的属性

来自分类Dev

绑定到子自定义控件的控件模板中父用户控件代码中定义的属性

来自分类Dev

自定义控件中的属性绑定到依赖项属性不起作用

来自分类Dev

绑定到wpf自定义控件依赖项属性以获取工具提示吗?

来自分类Dev

绑定到wpf自定义控件依赖项属性以获取工具提示吗?

来自分类Dev

如何将自定义Dependecy属性绑定到控件的视图模型?

来自分类Dev

如何将自定义Dependecy属性绑定到控件的视图模型?

来自分类Dev

将自定义控件中的DependencyProperty绑定到ViewModel属性

来自分类Dev

将ItemsControl中的viewmodel绑定到自定义用户控件

来自分类Dev

无法将ObservableCollection绑定到包含自定义控件的listView

来自分类Dev

将ControlTemplate子项绑定到自定义控件上的DependencyProperty无效

来自分类Dev

将ObservableCollection <int>绑定到自定义控件的IEnumerable <object>

来自分类Dev

将通用对象 (List<T>) 绑定到自定义 Xamarin 控件

来自分类Dev

自定义控件,绑定到背后的代码

来自分类Dev

绑定到ItemsControl的DataTemplate内部的自定义控件

来自分类Dev

自定义控件,绑定到背后的代码

来自分类Dev

将DataGrid.Columns集合绑定到自定义WPF UserControl中的祖先

来自分类Dev

将TableView中的CheckBox选中状态绑定到自定义模型属性

来自分类Dev

如何将属性从自定义聚合物元素绑定到angularjs

来自分类Dev

如何将元素内容绑定到自定义Command属性

来自分类Dev

自定义控件依赖项属性集合,计算嵌套的控件项

来自分类Dev

将参数从控件传递到自定义授权

来自分类Dev

将自定义对象属性绑定到BooleanBinding

Related 相关文章

  1. 1

    将集合绑定到自定义控件属性

  2. 2

    将属性绑定到自定义控件的另一个属性

  3. 3

    无法将对象的属性绑定到自定义控件

  4. 4

    如何将 ObservableCollection 正确绑定到自定义控件属性?

  5. 5

    WPF自定义控件:将CollectionViewSource绑定到DependencyProperty

  6. 6

    将自定义类型属性绑定到自定义控件

  7. 7

    绑定到子自定义控件的控件模板中父用户控件代码中定义的属性

  8. 8

    绑定到子自定义控件的控件模板中父用户控件代码中定义的属性

  9. 9

    自定义控件中的属性绑定到依赖项属性不起作用

  10. 10

    绑定到wpf自定义控件依赖项属性以获取工具提示吗?

  11. 11

    绑定到wpf自定义控件依赖项属性以获取工具提示吗?

  12. 12

    如何将自定义Dependecy属性绑定到控件的视图模型?

  13. 13

    如何将自定义Dependecy属性绑定到控件的视图模型?

  14. 14

    将自定义控件中的DependencyProperty绑定到ViewModel属性

  15. 15

    将ItemsControl中的viewmodel绑定到自定义用户控件

  16. 16

    无法将ObservableCollection绑定到包含自定义控件的listView

  17. 17

    将ControlTemplate子项绑定到自定义控件上的DependencyProperty无效

  18. 18

    将ObservableCollection <int>绑定到自定义控件的IEnumerable <object>

  19. 19

    将通用对象 (List<T>) 绑定到自定义 Xamarin 控件

  20. 20

    自定义控件,绑定到背后的代码

  21. 21

    绑定到ItemsControl的DataTemplate内部的自定义控件

  22. 22

    自定义控件,绑定到背后的代码

  23. 23

    将DataGrid.Columns集合绑定到自定义WPF UserControl中的祖先

  24. 24

    将TableView中的CheckBox选中状态绑定到自定义模型属性

  25. 25

    如何将属性从自定义聚合物元素绑定到angularjs

  26. 26

    如何将元素内容绑定到自定义Command属性

  27. 27

    自定义控件依赖项属性集合,计算嵌套的控件项

  28. 28

    将参数从控件传递到自定义授权

  29. 29

    将自定义对象属性绑定到BooleanBinding

热门标签

归档