数据绑定主窗口'的标题来查看模型'

本文关键字:模型 标题 数据绑定 窗口 | 更新日期: 2023-09-27 18:01:31

我有一个主窗口与以下代码:

<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
    }
}

我想通过设置窗口标题来改变它但是什么都没发生知道为什么吗

数据绑定主窗口'的标题来查看模型'

因为我不能从当前的代码中看到什么DataContext的主。xaml是,我将让a 猜测它是自己(而不是设置为其他东西)。我将进一步说,你的意图是设置主。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,那么你仍然需要有一个ViewModel为你的MainWindow(即MainWindowViewModel.cs),以某种方式接受消息(事件紧密耦合,事件聚合松散耦合)来更新该属性

你的ViewModel属性应该命名为WindowTitle而不是CurrentProfileName