2016-10-05 20 views
0

PrismをC#で使用しようとしていますが、私のモデルではなくviewmodelのアイテムにバインドするように設定されているようです。それは何かを学習するツールの多くである短いプログラムです。アイテムをViewModelに移動すると、SetPropertyのアイテムは変更のビューを通知していないようです。Prism 6.2 ViewModelではないモデルへのバインド

私はどのようにこの設定を後方に持っているかについての考えはありますか?

モデル:

namespace XMLValueModifier_Threaded_WPF.Models 
{ 
    public class XMLReadFileModel : BindableBase 
    { 
     private string _XMLMasterFile2 = "0"; 

     public string XMLGetFileName() 
     { 
      if (_XMLMasterFile2 != "1") 
       { 
        Microsoft.Win32.OpenFileDialog _XMLMasterFileDialog = new Microsoft.Win32.OpenFileDialog(); 

        _XMLMasterFileDialog.DefaultExt = "xml"; 
        _XMLMasterFileDialog.Filter = "xml Files (*.xml; *.XML) | *.xml; *.XML"; 

        Nullable<bool> result = _XMLMasterFileDialog.ShowDialog(); 

        if (result == true) 
        { 
         return _XMLMasterFileDialog.FileName; 
        } 
        return ""; 
       } 
       else 
       { 
        return ""; 
       } 
     } 
    } 
} 

のViewModel:

namespace XMLValueModifier_Threaded_WPF.ViewModels 
{ 
    public class MainDialogueViewModel : BindableBase 
    { 
     private string _XMLMasterFile; 

     public ICommand MasterFileLocation 
     { 
      get; 
      set; 
     } 

     public ICommand XMLFileLocation 
     { 
      get; 
      set; 
     } 

     public string XMLMasterFile 
     { 
      get 
      { 
       return _XMLMasterFile; 
      } 
      set 
      { 

       SetProperty(ref _XMLMasterFile, value); 
      } 
     } 

     private XMLReadFileModel xmlReadFileModel = new XMLReadFileModel(); 
     public MainDialogueViewModel() 
     { 
      XMLReadFileModel xmlReadFileModel = new XMLReadFileModel(); 
      Message = "example message"; 
      XMLMasterFile = "example File"; 

      this.MasterFileLocation = new DelegateCommand(chooseFile, canChooseFile); 
      this.XMLFileLocation = new DelegateCommand(chooseFile, canChooseFile); 
     } 

     public void masterfilelocation() 
     { 
      MessageBox.Show("i am here"); 
      return; 
     } 

     private void chooseFile() 
     { 
      XMLMasterFile = xmlReadFileModel.XMLGetFileName(); 
     } 

     private bool canChooseFile() 
     { 
      if (XMLMasterFile != null) 
      { 
       return true; 
      } 
      else 
      { 
       return true; 
      } 
     } 

    } 
} 

XAML:

<Window x:Class="XMLValueModifier_Threaded_WPF.Views.MainDialogue" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:XMLValueModifier_Threaded_WPF.ViewModels" Width="625" Height="452" 
    > 

<Grid Margin="0,-24,0,-3"> 
    <TextBox x:Name="Textbox1" Text="{Binding MainDialogueViewModel.XMLMasterFile,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="23" Margin="25,120,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="425"/> 
    <TextBox x:Name="Textbox2" Text="{Binding MainDialogueViewModel.XMLFiles,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="23" Margin="25,188,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="425" RenderTransformOrigin="0.506,1.565"/> 
    <Label Content="Location of Master XML File" HorizontalAlignment="Left" Margin="25,89,0,0" VerticalAlignment="Top"/> 
    <Label Content="Location of XML File(s)" HorizontalAlignment="Left" Margin="25,157,0,0" VerticalAlignment="Top"/></GRID> 

答えて

1

が正しくMainDialogueViewModelのインスタンスへのあなたのDataContextのセットアップを持っていると仮定すると、あなたのバインディングにMainDialogueViewModelを含める必要はありません。プロパティー名XMLMasterFileに単にバインドします。また、値が異なる場合、何も更新されないことに注意してください。

+0

デバッガをステップ実行すると、XMLMasterFile値の変更が表示されますが、ビューは更新されません。 DataContextが正しく設定されているかどうかはどこで確認できますか?私は、DataContextが使用されていない場合、xmlns:localが正しい場所へのバインディングを指すと考えました。 – coolercargo

+0

いいえ、ローカル名前空間はDataContextに対して何もしません。バインディングを使用するには、ViewのDataContextをViewModelのインスタンスに設定する必要があります。 –

+0

ブライアンに感謝、私はMainDialogueViewModelを取り出し、現在は動作しています。 – coolercargo

関連する問題