ItemsSource属性未在自定义控件中更新

时间:2014-09-20 09:35:29

标签: c# wpf xaml custom-controls dependency-properties

您好我使用以下代码段创建自定义控件以生成多个Menuitems,它是解释我的工作情景的示例代码段

通用XAML

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfCustomControlLibrary1">
    <Style TargetType="{x:Type local:CustomControl1}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                    <Menu ItemsSource="{Binding ItemsSource,RelativeSource={RelativeSource TemplatedParent}}">
                        <Menu.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Header}"/>
                            </DataTemplate>
                        </Menu.ItemTemplate>
                    </Menu>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

以下代码片段我在CustomControl中创建了DependencyProperty

    public class CustomControl1 : Control
    {
        static CustomControl1()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
        }

    public object ItemsSource
    {
        get { return (object)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }

    // Using a DependencyProperty as the backing store for ItemsSource.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ItemsSourceProperty =
        DependencyProperty.Register("ItemsSource", typeof(object), typeof(CustomControl1), new PropertyMetadata(0));    
}

此外,我还在我的xaml部分中对此自定义控件进行了intizialize,如下面的代码片段

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        xmlns:CustomLib="clr-namespace:WpfCustomControlLibrary1;assembly=WpfCustomControlLibrary1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>
        <Button Content="Add" Click="Button_Click"></Button>
        <CustomLib:CustomControl1 Name="CustomControl" ItemsSource="{Binding ListItems}" Grid.Row="1"/>
    </Grid>
</Window>

我在MainWindows.xaml.cs文件中创建了ListItems,并将DataContext定义为this.DataContex,如下面的代码片段

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window,INotifyPropertyChanged
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
            CreateListItems();
        }

        private void CreateListItems()
        {
            this.ListItems = new List<MenuModel>();
            this.ListItems.Add(new MenuModel() { Header = "Test1" });
            this.ListItems.Add(new MenuModel() { Header = "Test2" });
            this.ListItems.Add(new MenuModel() { Header = "Test3" });
        }

        private List<MenuModel> listItems;
        public List<MenuModel> ListItems
        {
            get
            {
                return listItems;
            }
            set
            {
                listItems = value;
                RaisePropertyChanged("ListItems");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void RaisePropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                var e = new PropertyChangedEventArgs(propertyName);

                handler(this, e);
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            this.ListItems.Add(new MenuModel() { Header = "Test4" });
            this.CustomControl.ItemsSource = this.ListItems;
        }
    }

    public class MenuModel
    {
        public string Header
        {
            get;
            set;
        }
    }
}

点击添加按钮后,我更改了ItemsSource,但未更新。你能帮我解决一下这个问题吗?

0 个答案:

没有答案