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

阮T

我正在现代化一个应用程序(从Windows窗体和VB.Net到WPF),该应用程序向用户显示最近的消息列表。我创建了一个MessageViewModel,一个MessagesListViewModel和两个自定义用户控件MessageListUserControlMessageUserControl

消息使用的是列出ItemsControlMessageListUserControl在垂直叠层板和使用被渲染MessageuserControl但是,所有消息的Message属性都设置为null,而不是当前消息。

我已经在我的代码下面包含了代码,如果有人对如何解决绑定有任何想法,我将不胜感激,因为这是我第一次使用WPF。

MessageViewModel

using System;
using System.ComponentModel;

namespace TestApp
{
    public class MessageViewModel : INotifyPropertyChanged
    {
        private string _sender;

        private string _subject;

        private string _content;

        public event PropertyChangedEventHandler PropertyChanged;

        public string Sender
        {
            get { return _sender; }
            set
            {
                _sender = value;
                NotifyPropertyChanged("Sender");
            }
        }

        public string Subject
        {
            get { return _subject; }
            set
            {
                _subject = value;
                NotifyPropertyChanged("Subject");
            }
        }

        public string Content
        {
            get { return _content; }
            set
            {
                _content = value.Trim();
                NotifyPropertyChanged("Content");
            }
        }

        private void NotifyPropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }
    }
}

MessageListViewModel

using System.Collections.ObjectModel;

namespace TestApp
{
    public class MessageListViewModel
    {
        private readonly ObservableCollection<MessageViewModel> _messages;

        public ObservableCollection<MessageViewModel> Messages
        {
            get { return _messages; }
        }

        public MessageListViewModel()
        {
            _messages = new ObservableCollection<MessageViewModel>();
        }

        #region Methods
        public void AddMessage(string sender, string subject, string content)
        {

            var vm = new MessageViewModel()
            {
                Sender = sender,
                Subject = subject,
                Content = content,
            };
            _messages.Insert(0, vm); // Insert it at the top of the list.
        }
        #endregion // Methods
    }
}

MessageUserControl

<UserControl x:Class="TestApp.MessageUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:TestApp"
             mc:Ignorable="d" x:Name="MessageCtrl" Background="White"
             d:DesignHeight="300" d:DesignWidth="300">
    <DockPanel>
        <Border BorderThickness="0,0,0,1" BorderBrush="DarkGray" DockPanel.Dock="Top">
            <Grid DockPanel.Dock="Top">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="60"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>

                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>

                <TextBlock Name="lblSender" Text="Sender" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" FontWeight="Bold" Padding="5"/>
                <TextBlock Name="txtSender" Text="{Binding Path=Sender, Mode=TwoWay}" HorizontalAlignment="Stretch" Grid.Row="0" Grid.Column="1" Padding="5"/>

                <TextBlock Name="lblSubject" Text="Subject" HorizontalAlignment="Left" Grid.Row="1" Grid.Column="0" FontWeight="Bold" Padding="5"/>
                <TextBlock Name="txtSubject" Text="{Binding Path=Subject, Mode=TwoWay}" HorizontalAlignment="Stretch" Grid.Row="1" Grid.Column="1" Padding="5"/>
            </Grid>
        </Border>

        <TextBox BorderThickness="0" Background="Transparent" IsReadOnly="True" Name="txtMessageContent" Text="{Binding Path=Content, Mode=TwoWay}" DockPanel.Dock="Top" Padding="5" VerticalAlignment="Center" HorizontalAlignment="Stretch" TextWrapping="WrapWithOverflow" />
    </DockPanel>
</UserControl>

MessageListUserControl

<UserControl x:Class="TestApp.MessageListUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:TestApp"
             mc:Ignorable="d" Background="White" x:Name="MessagesListCtrl"
             d:DesignHeight="300" d:DesignWidth="300">
    <DockPanel>
        <ItemsControl x:Name="MessagesStack" Grid.Column="0" ItemsSource="{Binding Path=Messages}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Vertical"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <local:MessageControl Message="{Binding Path=., Mode=TwoWay}" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </DockPanel>
</UserControl>

结果最终如下所示,主题,发件人和内容为空:

空消息详细信息

我也试着设置在结合DataTemplateMessageListUserControl,以{Binding /}作为发现这里没有成功,以及设置DataContext={Binding}

当我将用于单个消息显示的模板XAML直接移动到中时DataTemplate,一切正常,但是我希望将其分成一个单独的控件,以对它执行一些额外的逻辑。

安朱姆·汗

从移除Message财产

<local:MessageControl Message="{Binding Path=., Mode=TwoWay}" />

完全不需要。

DataContextMessageControl您已经完成的操作中删除

一切保持不变,现在可以正常工作。

DataTemplate会得到它的DataContext自动MessageViewModel

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

WPF:自定义创建的用户控件中的数据绑定

来自分类Dev

如何使用Generic.xaml中的样式将值从用户控件传递到自定义控件?

来自分类Dev

将用户控件属性绑定到ItemsControl

来自分类Dev

将密钥绑定到feh中的自定义脚本

来自分类Dev

用户控件中的自定义方法

来自分类Dev

用户控件中的自定义事件

来自分类Dev

WPF自定义控件-绑定到在后台代码中定义的命令

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

自定义用户控件不绑定数据

来自分类Dev

WPF数据将ViewModel属性绑定到用户控件内部的ListBox中,背后的代码

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

动态将自定义控件中的编辑框绑定到托管bean

来自分类Dev

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

来自分类Dev

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

来自分类Dev

将通用参数绑定到Web API中的自定义模型绑定器

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

    WPF:自定义创建的用户控件中的数据绑定

  9. 9

    如何使用Generic.xaml中的样式将值从用户控件传递到自定义控件?

  10. 10

    将用户控件属性绑定到ItemsControl

  11. 11

    将密钥绑定到feh中的自定义脚本

  12. 12

    用户控件中的自定义方法

  13. 13

    用户控件中的自定义事件

  14. 14

    WPF自定义控件-绑定到在后台代码中定义的命令

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

    自定义用户控件不绑定数据

  22. 22

    WPF数据将ViewModel属性绑定到用户控件内部的ListBox中,背后的代码

  23. 23

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

  24. 24

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

  25. 25

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

  26. 26

    动态将自定义控件中的编辑框绑定到托管bean

  27. 27

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

  28. 28

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

  29. 29

    将通用参数绑定到Web API中的自定义模型绑定器

热门标签

归档