这里是解决方案代码它在XAML中执行所有的操作,而不是后端的C#。这是我该怎么办利用MVVM我的项目(减少后端代码,如果可能的话没有后端代码)
<ListBox x:Name="lstServers" HorizontalAlignment="Left" Height="285" Margin="20,37,0,0" VerticalAlignment="Top" Width="215"
ItemsSource="{Binding Settings.Servers}"
SelectedItem="{Binding Settings.ManageSelectedServer, Mode=TwoWay}"
DisplayMemberPath="UserFriendlyName"/>
这是窗口列表框。这里指出的要点非常棘手,通常的ItemsSource属性被设置为我的视图模型上的Settings对象,该对象具有Servers Observable集合。
服务器是一个具有名为UserFriendlyName属性的类。
public sealed class AutoSyncServer : ObservableModel
{
public AutoSyncServer()
{
Port = "80";
UserFriendlyName = "AutoSync Server";
Server = "localhost";
}
private string _userFriendlyName;
public string UserFriendlyName
{
get { return _userFriendlyName;}
set
{
_userFriendlyName = value;
OnPropertyChanged("UserFriendlyName");
}
}
这是您自己的类的部分代码片段。
ListBox的SelectedItem绑定到我存储在名为ManageSelectedServer的模型视图中的Selected对象的实例。
棘手的部分这里是DisplayMemberPath设置为“UserFriendlyName”而不是“{Binding UserFriendlyName}”。 这是密钥
如果使用{Binding UserFriendlyName},它将在集合中显示UserFriendlyNames,但不会反映对该属性的任何更改。
的XAML对TextBox其中用户可以更新用户友好名称(其应该改变在列表框中也文本)是:
<TextBox x:Name="txtDisplayName" HorizontalAlignment="Left" Height="23" Margin="395,40,0,0" TextWrapping="Wrap"
Text="{Binding ElementName=lstServers,Path=SelectedItem.UserFriendlyName, UpdateSourceTrigger=PropertyChanged}"
VerticalAlignment =“顶部” WIDTH =“240” />
这设置TextBox的Text属性并将其绑定到ListBox元素lstServers SelectedItem属性UserFriendlyName。我还包含一个UpdateSourceTrigger = PropertyChanged,以便对文本源进行的任何更改都会通知它们已被更改。
XAML很棘手!