silverlight MVVM Viewmodel到视图绑定不工作
我有一个真正简单的例子,它在没有viewmodel的情况下可以很好地工作,因为我有一个项目 实现iNotifyPropertyChanged的类:silverlight MVVM Viewmodel到视图绑定不工作,silverlight,mvvm,binding,Silverlight,Mvvm,Binding,我有一个真正简单的例子,它在没有viewmodel的情况下可以很好地工作,因为我有一个项目 实现iNotifyPropertyChanged的类: public class Item : INotifyPropertyChanged { private string _name; private string _desc; public string Name {
public class Item : INotifyPropertyChanged
{
private string _name;
private string _desc;
public string Name
{
get
{ return _name; }
set
{
if (_name == value)
return;
_name = value;
this.OnPropertyChanged(new PropertyChangedEventArgs("Name"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public Item()
{
}
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, e);
}
}
这在一个简单的示例中起作用,其中我有以下代码:
public MainPage()
{
InitializeComponent();
item = new Item() { Name = "john", Description = "this is my name" };
LayoutRoot.DataContext = item;
}
如果我有一个按钮,在代码中调用命令处理程序,我会看到更改
将事件“侦听”到简单UI作为属性更改
我的文本属性上的双向绑定。处理程序如下所示:
private void Button_Click(object sender, RoutedEventArgs e)
{
item.Name = "ted";
item.Description = "adddress";
}
public class MyViewModel
{
Item item = null;
public ICommand ChangeCommand { get; private set; }
public MyViewModel()
{
item = new Item() { Name = "john", Description = "jjjj" };
ChangeCommand = new DelegateCommand<string>(OnChange);
}
private void OnChange(string title)
{
item.Name = "bill";
}
当然这会改变用户界面(我说这是一个非常简单的例子)
现在,我介绍了一个Viewmodel,对简单模型的更改没有反映为
没有人在监听被改变的财产
我将视图中的datacontext设置为viewmodel,实际上这是视图中唯一的一行代码:
LayoutRoot.DataContext = new MyViewModel();
现在,我的Viewmodel看起来像:
private void Button_Click(object sender, RoutedEventArgs e)
{
item.Name = "ted";
item.Description = "adddress";
}
public class MyViewModel
{
Item item = null;
public ICommand ChangeCommand { get; private set; }
public MyViewModel()
{
item = new Item() { Name = "john", Description = "jjjj" };
ChangeCommand = new DelegateCommand<string>(OnChange);
}
private void OnChange(string title)
{
item.Name = "bill";
}
公共类MyViewModel
{
Item=null;
公共ICommand ChangeCommand{get;private set;}
公共MyViewModel()
{
item=newitem(){Name=“john”,Description=“jjj”};
ChangeCommand=新的DelegateCommand(OnChange);
}
私有void OnChange(字符串标题)
{
item.Name=“票据”;
}
注:
我使用模式和实践命令将事件从XAML激发到Viewmodel
这很有效
我的处理程序再次更改item.name,这将导致调用setter和
正在调用此.OnPropertyChanged(新的PropertyChangedEventArgs(“名称”);但未调用任何人
正在侦听,因此不会进行任何更改
我试图保持这个例子真正简单,有些人会说太简单,但我只是想
知道绑定不起作用的原因。我可以从视图拉到视图模型,但我需要
我想知道我遗漏了哪一点。您正在绑定到一个没有公开属性的MyViewModel实例。尝试创建并绑定到一个公共MyViewModel.Item属性。事实上,我注意到了同样的事情,并将代码更改为:
private Item _item;
public ICommand ChangeCommand { get; private set; }
public MyViewModel()
{
myitem = new Item() { Name = "john", Description = "jjjj" };
ChangeCommand = new DelegateCommand<string>(OnChange);
}
private void OnChange(string title)
{
_item.Name = "bill";
// SelectedItem = _item;
}
public Item myitem
{
get{return _item;}
set
{
_item = value;
RaisePropertyChanged(new PropertyChangedEventArgs("myitem"));
}
}
private Item\u Item;
公共ICommand ChangeCommand{get;private set;}
公共MyViewModel()
{
myitem=newitem(){Name=“john”,Description=“jjj”};
ChangeCommand=新的DelegateCommand(OnChange);
}
私有void OnChange(字符串标题)
{
_item.Name=“票据”;
//选择编辑项=_项;
}
公共项目myitem
{
获取{return\u item;}
设置
{
_项目=价值;
RaisePropertyChanged(新属性ChangedEventArgs(“myitem”);
}
}
但我的字段仍然没有填充,直到我在文本字段周围放置了一个网格,并通过以下XAML中的网格datacontext=“{Binding myitem>”设置datacontext:
- <UserControl
x:Class="BindingStart.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewmodel="clr-namespace:BindingStart"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Commands="clr-namespace:Microsoft.Practices.Composite.Presentation.Commands;assembly=Microsoft.Practices.Composite.Presentation"
mc:Ignorable="d" d:DesignWidth="640"
d:DesignHeight="480"
>
<UserControl.Resources>
<viewmodel:MyViewModel x:Key="ViewModel" />
</UserControl.Resources> <Grid x:Name="LayoutRoot"
DataContext="{StaticResource
ViewModel}">
<StackPanel>
<Grid DataContext="{Binding myitem}">
<Grid.RowDefinitions>
<RowDefinition Height="22" />
<RowDefinition Height="22" />
<RowDefinition Height="22" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="300" />
<ColumnDefinition Width="20" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0"
Foreground="Black">SupplierName</TextBlock>
<TextBox x:Name="SName" Grid.Row="0" Grid.Column="1 "
IsReadOnly="True" Text="{Binding
Name, Mode=TwoWay}" />
-
供应商名称
现在我可以在代码中设置上下文,但我有点喜欢XAML解决方案。我不确定为什么需要执行此步骤,但它似乎起作用了我想我正确地猜到了您的问题,但是如果您另外包含XAML数据绑定代码,问题会更清楚。