我正在现代化一个应用程序(从Windows窗体和VB.Net到WPF),该应用程序向用户显示最近的消息列表。我创建了一个MessageViewModel
,一个MessagesListViewModel
和两个自定义用户控件MessageListUserControl
和MessageUserControl
。
消息使用的是列出ItemsControl
在MessageListUserControl
在垂直叠层板和使用被渲染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>
结果最终如下所示,主题,发件人和内容为空:
我也试着设置在结合DataTemplate
中MessageListUserControl
,以{Binding /}
作为发现这里没有成功,以及设置DataContext={Binding}
。
当我将用于单个消息显示的模板XAML直接移动到中时DataTemplate
,一切正常,但是我希望将其分成一个单独的控件,以对它执行一些额外的逻辑。
从移除Message
财产
<local:MessageControl Message="{Binding Path=., Mode=TwoWay}" />
完全不需要。
DataContext
从MessageControl
您已经完成的操作中删除。
一切保持不变,现在可以正常工作。
该DataTemplate
会得到它的DataContext
自动MessageViewModel
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句