silverlight绑定组合框在嵌套控件中

时间:2010-11-05 15:29:02

标签: silverlight data-binding mvvm

我有2个用户控件,一个名为Filters,另一个名为FilterItem

过滤器看起来像这样:

<UserControl xmlns:my="clr-namespace:AttorneyDashboard.Views.UserControls"  x:Class="AttorneyDashboard.Views.UserControls.Filters"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:helpers="clr-namespace:AttorneyDashboard.Helpers"
    mc:Ignorable="d"
    d:DesignHeight="150" d:DesignWidth="590" x:Name="FiltersRoot">
    <Grid>
        <ListBox x:Name="myListBox" ItemsSource="{Binding Path=FilterItems, ElementName=FiltersRoot}" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <my:FilterItem ColumnsList="{Binding Path=Columns_, ElementName=FiltersRoot}" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</UserControl>

代码背后:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Data;
using System.Collections.ObjectModel;
using System.Diagnostics;
using AttorneyDashboard.Helpers;

namespace AttorneyDashboard.Views.UserControls
{
    public class MyItems
    {
        public string Header { get; set; }
    }
    public partial class Filters : UserControl
    {
        public Filters()
        {
            InitializeComponent();

        }
        private DependencyProperty FilterItemsProperty = DependencyProperty.Register("FilterItems", typeof(ObservableCollection<FilterDescriptor>), typeof(Filters), new PropertyMetadata(null, new PropertyChangedCallback(OnChangeFilterItems)));
        public ObservableCollection<FilterDescriptor> FilterItems
        {
            get
            {
                return (ObservableCollection<FilterDescriptor>)GetValue(FilterItemsProperty);
            }
            set
            {
                SetValue(FilterItemsProperty, value);
            }
        }


        public static void OnChangeFilterItems(DependencyObject d, DependencyPropertyChangedEventArgs e)
        { 
        }



        public List<MyItems> Columns_
        {
            get
            {
                List<MyItems> list = new List<MyItems>();
                list.Add(new MyItems() { Header = "test1" });
                list.Add(new MyItems() { Header = "test2" });
                list.Add(new MyItems() { Header = "test3" });
                return list;
            }
        }
    }
}

FilterItems看起来像这样

<UserControl x:Class="AttorneyDashboard.Views.UserControls.FilterItem"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="23" d:DesignWidth="590" xmlns:my="clr-namespace:AttorneyDashboard.Helpers" x:Name="FilterItemRoot">
    <StackPanel Orientation="Horizontal">
        <ComboBox Height="23" HorizontalAlignment="Left" Name="FieldName" VerticalAlignment="Top" Width="120" Margin="5,0,0,0" ItemsSource="{Binding Path=ColumnsList, ElementName=FilterItemRoot}" SelectedItem="{Binding PropertyPath, Mode=TwoWay}" DisplayMemberPath="Header"/>
    </StackPanel>
</UserControl>

代码背后:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using AttorneyDashboard.Helpers;
using System.Windows.Data;

namespace AttorneyDashboard.Views.UserControls
{
    public partial class FilterItem : UserControl
    {
        public FilterItem()
        {
            InitializeComponent();
        }

        private DependencyProperty ColumnsListProperty = DependencyProperty.Register("ColumnsList", typeof(List<MyItems>), typeof(FilterItem), new PropertyMetadata(null, new PropertyChangedCallback(OnChangeColumns)));
        public List<MyItems> ColumnsList
        {
            get
            {
                return (List<MyItems>)GetValue(ColumnsListProperty);
            }
            set
            {
                SetValue(ColumnsListProperty, value);
            }
        }

        public static void OnChangeColumns(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
        }
    }
}

FilterItems的数量是可以的(这意味着FilterItems绑定工作正常),但只填充了最后一个FilterItem的Combobox ... 我不知道到底出了什么问题......

更新 我找到了原因,但我不知道解决方案...... 它接缝FilterItem的内容在他的属性之前被绑定.. 因此,在Columns属性绑定之前,FilterItem中的组合框被绑定...

2 个答案:

答案 0 :(得分:0)

您在FilterItem中的代码

 private DependencyProperty ColumnsListProperty = DependencyProperty
     .Register("ColumnsList", typeof(List<MyItems>), typeof(FilterItem), 
         new PropertyMetadata(null, new PropertyChangedCallback(OnChangeColumns)));

请,让它静止:

 private **static** DependencyProperty ColumnsListProperty = DependencyProperty
     .Register("ColumnsList", typeof(List<MyItems>), typeof(FilterItem), 
         new PropertyMetadata(null, new PropertyChangedCallback(OnChangeColumns)));

多数民众赞成。

P.S。 :在过滤器中,依赖属性也是静态的,通常在任何地方都可以:)

答案 1 :(得分:-1)

您已在x:Name元素上直接放置了UserControl属性。不要那样做。请改用此模式: -

<UserControl x:Class="AttorneyDashboard.Views.UserControls.FilterItem" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="23" d:DesignWidth="590" xmlns:my="clr-namespace:AttorneyDashboard.Helpers" >
    <StackPanel Orientation="Horizontal" x:Name="LayoutRoot"> 
        <ComboBox Height="23" HorizontalAlignment="Left" Name="FieldName" VerticalAlignment="Top" Width="120" Margin="5,0,0,0" ItemsSource="{Binding Path=Parent.ColumnsList, ElementName=LayoutRoot}" SelectedItem="{Binding PropertyPath, Mode=TwoWay}" DisplayMemberPath="Header"/> 
    </StackPanel> 
</UserControl> 

您无法控制分配给用户控件的名称,该名称属于使用您的UserControl的Xaml范围。如果您的代码在内部要求包含UserControl具有特定名称,则事情可能会中断。