0

私は mvvm の概念の初心者です。サンプル アプリケーションを 1 つ試しました。名前と ID の 2 つのテキスト ボックス、1 つの送信ボタン、1 つのラベルが含まれています。送信ボタンをクリックすると、テキスト ボックスの 2 つの文字列が結合され、ラベルに表示されます。

私は値を送信することができ、ビューモデルではプロパティに結果が含まれています.しかし、ビューに表示されません.なぜ..?

ビューに含まれる

<grid>
<TextBox Grid.Column="1" Grid.Row="1" Text="{Binding name}"  Height="23"  Margin="9" Name="txtname"  Width="120" />
<TextBox Grid.Column="1" Grid.Row="2" Text="{Binding id}" Height="23"  Margin="9" Name="txtid"  Width="120" />
<Button Command="{Binding submit}" Content="submit" Grid.Column="2" Grid.Row="2" Height="23"   Name="btnsubmit"  Width="75" />
<Label Content="{Binding display}" Grid.Row="3" Height="38" HorizontalAlignment="Left"  Name="lbldisplay"  Width="192" />

</grid>

view.csコードは

public MainWindow()
    {
        InitializeComponent();
        DataContext = new DemoViewModel();
    }

私のビューモデルには2つの.csファイルが含まれています

1 つは DemoViewModelInotify.cs.in で、これに inotifypropertychanged のコードを記述します。もう 1 つは DemoViewModel.cs です。これには、プロパティとコマンドが含まれています。

namespace mvvmdemonixon.ViewModel
{
public  class DemoViewModel :DemoViewModelInotify
{
  public ICommand submit { get; set; }

  public string name { get; set; }
  public string display { get; set; }
  public int id{get;set;}
  public DemoModel model { get; set; }
  public DemoViewModel()
  {

      submit = new DelegateCommand<object>(this.add);

  }

  public void add(object paramter)
  {
    string a=  mvvmdemonixon.Model.DemoModel.addstring(name, id);
    display = a;
  }

}
}

私のモデルには含まれています

namespace mvvmdemonixon.Model
{
public  class DemoModel
{
   public static string addstring(string name1, int no1)
   {
       string display = "The Student Name Is " + name1 + "and Id Is" + no1 + ".";
       return display;
   }

}
}

私のapp.xaml.csで

private void OnStartup(object sender, StartupEventArgs e)
    {
        mvvmdemonixon.MainWindow view = new MainWindow();
        view.DataContext = new mvvmdemonixon.ViewModel.DemoViewModel();
        view.Show();
    }

私のアプリのxamlで

<Application x:Class="mvvmdemonixon.App"
Startup="OnStartup">
</Application>

よろしくお願いします..

4

3 に答える 3

2

WPF バインド エンジンはINotifyPropertyChanged、(スカラー プロパティの場合) インターフェイスとINotifyCollectionChanged(コレクション プロパティの場合) インターフェイスを使用して、バインドされたデータ ソース (ビュー モデル) で行われた変更を反映します。

これ:

public string display { get; set; }

セッターのコードには通知が含まれていないため、プロパティ設定はビューに通知しませんコードは次のようになります。

public string display 
{ 
    get { return _display; }
    set
    {
        if (_display != value)
        {
            _display = value;
            OnPropertyChanged("display");
        }
    } 
}
private string _display;

どこでイベントを発生さOnPropertyChangedINotifyPropertyChanged.PropertyChangedます。

これは、ビューを更新する必要がある、ビュー モデル内の他のビュー バインド プロパティにも当てはまります。

于 2012-10-29T07:36:01.493 に答える
0

あなたに欠けていたことが2つあります。最初に、View のバインドは OneTime です。2 つ目は、プロパティが変更されたときに ViewModel が通知しないことです。

最初の問題を修正するには、以下のように xaml を更新する必要があります。

<Label Content="{Binding display, Mode=OneWay}" Grid.Row="3" Height="38" HorizontalAlignment="Left"  Name="lbldisplay"  Width="192" />

2 番目の問題を解決するには、INotifyPropertyChangedを実装する必要があります。

于 2012-10-29T07:36:51.520 に答える
0

ViewModel にINotifyPropertyChangedを実装する必要があります。そして、各プロパティ セッターからプロパティ変更イベントを発生させます。

于 2012-10-29T07:34:39.257 に答える