silverlight MVVM Viewmodel到视图绑定不工作

silverlight MVVM Viewmodel到视图绑定不工作,silverlight,mvvm,binding,Silverlight,Mvvm,Binding,我有一个真正简单的例子,它在没有viewmodel的情况下可以很好地工作,因为我有一个项目 实现iNotifyPropertyChanged的类: public class Item : INotifyPropertyChanged { private string _name; private string _desc; public string Name {

我有一个真正简单的例子,它在没有viewmodel的情况下可以很好地工作,因为我有一个项目 实现iNotifyPropertyChanged的类:

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数据绑定代码,问题会更清楚。