2011-07-08 21 views
1

我有下面的代码的主窗口:在LogParserViewModel.cs类数据绑定主窗口的标题,查看模型的属性

<Window x:Class="CAMXSimulator.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:View="clr-namespace:CAMXSimulator.View" 
     xmlns:ViewModel="clr-namespace:CAMXSimulator.ViewModel" 
     Icon="Resources/Images/Tractor.png" 
     Title="{Binding WindowTitle}" 

     Height="400" Width="600"> 

    <Window.Resources> 
     <DataTemplate DataType="{x:Type ViewModel:LogParserViewModel}"> 
      <View:LogView /> 
     </DataTemplate> 
    </Window.Resources> 

     <Grid ShowGridLines="True"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 



     <Border CornerRadius="5" BorderBrush="SteelBlue" BorderThickness="2" Grid.Row="2" Margin="0,5,5,0" > 
      <View:LogView /> 
     </Border> 

    </Grid> 

</Window> 

我有以下

编辑:

class LogParserViewModel : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     // public event PropertyChangedEventHandler PropertyChanged1; 
     private IDbOperations _camxdb; 
     #region private_virables 
     private string _vManageLogFile; 
     private string _camxNodes; 
     private IEnumerable<Tuple<string, string>> _camxnodesAsTuple; 
     RelayCommand _clearFieldscommand; 
     RelayCommand _runsimulationcommand; 

     private string _currentProfileName; 

     #endregion 

     #region Getters\Setters 
     public string CurrentProfileName 
     { 
      get { return _currentProfileName; } 
      set 
      { 
       _currentProfileName = value; 
       OnPropertyChanged("CurrentProfileName"); 
       OnPropertyChanged("WindowTitle"); 
      } 
     } 



     public string VManageLogFile 
     { 
      get { return _vManageLogFile; } 
      set { _vManageLogFile = value; 

        if(null != PropertyChanged) 
        { 
         // PropertyChanged(this, new PropertyChangedEventArgs("VManageLogFile")); 
         OnPropertyChanged("VManageLogFile"); 
        } 
      } 
     } 

     public string CamxNodes 
     { 
      get { return _camxNodes; } 
      set 
      { 
       _camxNodes = value; 
       if (null != PropertyChanged) 
       { 
        //PropertyChanged1(this, new PropertyChangedEventArgs("CamxNodes")); 
        OnPropertyChanged("CamxNodes"); 
       } 

      } 
     } 
     #endregion 

     protected void OnPropertyChanged(string name) 
     { 
      // PropertyChangedEventHandler handler = PropertyChanged; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(name)); 
      } 
     } 

     #region Constructors 
     public LogParserViewModel() 
     { 
      // PropertyChanged1 = new PropertyChangedEventHandler(); 
      //PropertyChanged += UpdateCamxWindowEvent; 
      PropertyChanged += (s, e) => { if (e.PropertyName == "VManageLogFile") UpdateCamxWindowEvent(s, e); }; 

      //creates a instance of database object 
      _camxdb = new DbOperations(); 


     } 
     #endregion 

     #region Event_Hendlers 
     /// <summary> 
     /// This event is called when vManageLog window has changed 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 
     private void UpdateCamxWindowEvent(object sender, EventArgs e) 
     { 
      if (_vManageLogFile == null) 
       return; 

      //creates object of parser 
      var parser = new VManageLogParser(_vManageLogFile); 
      //returns a tuple of string string 
      _camxnodesAsTuple = parser.Parse(); 
      //creates a string as we see it in the CAMX window of the simulator 
      CamxNodes = parser.CamxWindowText2(_camxnodesAsTuple); 
      MyLogger.Logger.Info("The Tabs been updated"); 

      CurrentProfileName = "CAMX Simulator"; 


     } 
     #endregion 

     #region Drag & DragOver 
     public void DragOver(DragEventArgs args) 
     { 
      // As an arbitrary design decision, we only want to deal with a single file. 
      if (IsSingleTextFile(args) != null) args.Effects = DragDropEffects.Copy; 
      else args.Effects = DragDropEffects.None; 

      // Mark the event as handled, so TextBox's native DragOver handler is not called. 
      args.Handled = true; 
     } 

     public void Drop(DragEventArgs args) 
     { 
      using (new WaitCursor()) 
      { 


       // Mark the event as handled, so TextBox's native Drop handler is not called. 
       args.Handled = true; 

       string fileName = IsSingleTextFile(args); 
       if (fileName == null) return; 

       StreamReader fileToLoad = new StreamReader(fileName); 
       VManageLogFile = fileToLoad.ReadToEnd(); 
       // DisplaySFMFileContents.Text = fileToLoad.ReadToEnd(); 

       fileToLoad.Close(); 

      } 
     } 

     // If the data object in args is a single file, this method will return the filename. 
     // Otherwise, it returns null. 
     private string IsSingleTextFile(DragEventArgs args) 
     { 
      // Check for files in the hovering data object. 
      if (args.Data.GetDataPresent(DataFormats.FileDrop, true)) 
      { 
       string[] fileNames = args.Data.GetData(DataFormats.FileDrop, true) as string[]; 
       // Check fo a single file or folder. 
       if (fileNames.Length == 1) 
       { 
        // Check for a file (a directory will return false). 
        if (File.Exists(fileNames[0])) 
        { 
         //Check for the file extention , we look only for txt extentions 
         FileInfo info = new FileInfo(fileNames[0]); 
         if (info.Extension == ".txt") 
         { 
          MyLogger.Logger.Info("Name of file: " + fileNames[0]); 
          // At this point we know there is a single file text file.); 
          return fileNames[0]; 
         } 

        } 
       } 
      } 
      MyLogger.Logger.Warn("Not a single file"); 
      return null; 
     } 
     #endregion 

     #region ClearCommand 

     public ICommand ClearFieldsCommand 
     { 
      get 
      { 
       if (_clearFieldscommand == null) 
        _clearFieldscommand = new RelayCommand(
         () => ClearFields(), 
         () => CanClearWindows); 

       return _clearFieldscommand; 
      } 
     } 

     void ClearFields() 
     { 
      VManageLogFile = null; 
      CamxNodes = null; 
     } 
     bool CanClearWindows 
     { 
      get { return (VManageLogFile != null); } 
     } 


     #endregion 

     #region RunSimulation 
     public ICommand RunSimulationCommand 
     { 
      get 
      { 
       if (_runsimulationcommand == null) 
        _runsimulationcommand = new RelayCommand(
         () => RunSimulation(), 
         () => CanRunSimulation); 

       return _runsimulationcommand; 
      } 
     } 

     void RunSimulation() 
     { 
      using (new WaitCursor()) 
      { 
       try 
       { //inserting the CAMX nodes to the table 
        foreach (var camxNode in _camxnodesAsTuple) 
        { 
         _camxdb.Insert(camxNode); 

        } 
       } 
       catch (Exception ex) 
       { 

        MyLogger.Logger.FatalException("Cannot Insert to Database" , ex); 
       } 

      } 
     } 

     bool CanRunSimulation 
     { 
      get { return !GlobalMethods.IsEmpty(_camxnodesAsTuple); } 
     } 
     #endregion 
    } 
} 

我试图通过选择它来改变Windows标题,但没有任何想法为什么?

+1

您需要更多代码和XAML才能帮助您。即,主窗口的DataContext设置为什么? –

+0

另外,你是否使用任何框架(棱镜,Caliburn等)? –

+0

@ myermian,我添加了所有代码,并且我没有使用任何框架 –

回答

1

由于我无法从当前的代码main.xaml的DataContext的是什么看,我要采取猜测那它本身(没有设置别的东西)。我会进一步说,你的目的是为了在main.xaml的DataContext的设置为视图模型:

XAML:

<Window x:Class="Namespace.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="{Binding WindowTitle}"> 

    <!-- YOUR XAML --> 

</Window> 

代码背后:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new MainWindowViewModel(); 
    } 
} 

哪里MainWindowViewModel。 cs包含WindowTitle的属性。

如果你想要一些其他的类来控制WindowTitle,那么你仍然需要为你的MainWindow(即MainWindowViewModel.cs)接收消息的ViewModel(紧耦合事件,松散耦合的事件聚合)更新该属性。

0

您的视图模型属性应该被命名为WindowTitle代替CurrentProfileName

+1

或者将xaml中的绑定更改为Title =“{Binding CurrentProfileName}”和代码OnPropertyChanged(“CurrentProfileName”); – Nagg

+0

我试过了,但没有奏效 –

+0

虽然可能是这个问题,但OP也可能会引发'WindowTitle'属性更改的事件,因为另一个名为'WindowTitle'的属性受'CurrentProfileName'影响财产变化。 –