数据绑定主窗口的标题,用于查看模型的属性

时间:2011-07-08 19:37:22

标签: c# wpf data-binding

我有一个主窗口,其中包含以下代码:

<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标题,但没有任何想法发生任何想法?

2 个答案:

答案 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