我有一个主窗口,其中包含以下代码:
<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>
在LogParserViewModel.cs类中,我有以下
编辑:
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标题,但没有任何想法发生任何想法?
答案 0 :(得分:2)
由于我无法从当前代码中看到main.xaml的DataContext是什么,我将采用猜测它本身(不设置为别的东西)。我将进一步说,你的意图是将main.xaml的DataContext设置为ViewModel:
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,它以某种方式接受消息(紧密耦合的事件,松散耦合的事件聚合)到更新该属性。
答案 1 :(得分:0)
ViewModel中的属性应命名为WindowTitle
,而不是CurrentProfileName