c # Нужна помощь WPF: как показать значения из объекта через WPF - PullRequest
0 голосов
/ 21 февраля 2019

[Отредактировано 2019-02-23;Я надеюсь, что это правильно, чтобы отредактировать вопрос]

Я полный новичок в WPF и изо всех сил.Я просмотрел множество учебных пособий и т. Д., Но не нашел ответа (насколько я понимаю).

Я создаю игру Yatzy, и сам класс Yatzy сам по себе почти завершен.Теперь я хотел бы добавить графический интерфейс с использованием WPF в класс yatzy.

Благодаря вкладу Реджинальда Блю, отвечающего на v1 моего вопроса.Я работаю над моделью представления.

Марк Уиталл сделал хороший пример , но я не могу перенести его на свои нужды:

Но это также беспокоит меня.Я надеюсь, что поставляемый код является достаточным, если нет - спросите: -)

Похоже, моя модель представления имеет "контакт" с моей моделью.Это супер. Но что касается моего вида, соединяющегося с моей моделью представления, то, похоже, что-то не так.

Что я хотел бы, для начала: 1) Когда поля GameStatus и GameName должны иметь значения по умолчанию из моей модели.До того, как сделать мою модель, это работало нормально, но я все испортил.Я объявляю свой объект thisYatzy в maincontrol.cs (в модели представления).Должен ли я объявить это на уровне app.xaml?2) Когда я нажимаю ShiftState «кнопка», я вызываю свою модель представления для изменения состояния и обновляю представление.Но с точки зрения я не могу назвать модель представления?

Я надеюсь, что я все объяснил, и что кто-то из вас может помочь: -)

VIEW:

app.xalm

<Application x:Class="WPFYatzy.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WPFYatzy"
             StartupUri="Views/MainWindow.xaml">
    <Application.Resources>

    </Application.Resources>
</Application>

app.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WPFYatzy.Views
{
    /// <summary>
    /// Interaction logic for Page1.xaml
    /// </summary>
    public partial class Page1 : Page
    {
        public Page1()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
                 }
    }
}

mainwindow.xaml

<Window x:Class="MinimalMVVM.Views.ConvertWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Views="clr-namespace:WPFYatzy.Views"
        xmlns:ViewModels="clr-namespace:WPFYatzy.ViewModel"
        Title="YatzyGame - mainwindow"
        MinWidth="300"
        ResizeMode="NoResize"
        SizeToContent="WidthAndHeight">

    <Window.DataContext>
        <ViewModels:MainControl/>
    </Window.DataContext>

    <Views:Page1/>

</Window>

mainwindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using YatzyGameCL;

namespace WPFYatzy
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        //YatzyGame thisYatzy = new YatzyGame();

        public MainWindow()
        {
            //InitializeComponent();
        }

        private void OnInit(object sender, EventArgs e)
        {

        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {

        }
    }

}

page1.xaml

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WPFYatzy.Views
{
    /// <summary>
    /// Interaction logic for Page1.xaml
    /// </summary>
    public partial class Page1 : Page
    {
        public Page1()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
                 }
    }
}

page1.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WPFYatzy.Views
{
    /// <summary>
    /// Interaction logic for Page1.xaml
    /// </summary>
    public partial class Page1 : Page
    {
        public Page1()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
                 }
    }
}

Viewmodel

ObservableObject.cs

using System.ComponentModel;

namespace WPFYatzy.ViewModel
{
    public abstract class ObservableObject : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChangedEvent(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

DelegateCommand.cs

using System;
using System.Windows.Input;

namespace WPFYatzy.ViewModel
{
    public class DelegateCommand : ICommand
    {
        private readonly Action _action;

        public DelegateCommand(Action action)
        {
            _action = action;
        }

        public void Execute(object parameter)
        {
            _action();
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

#pragma warning disable 67
        public event EventHandler CanExecuteChanged { add { } remove { } }
#pragma warning restore 67
    }
}

MainControl.cs

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows.Input;
using YatzyGameCL;

namespace WPFYatzy.ViewModel
{
    class MainControl : ObservableObject
    {
        private YatzyGame thisYatzy = new YatzyGame();

        private string _strGameName;
        private string _strGameStatus;

        public string GameName
        {
            get { return _strGameName; }
            set
            {
                _strGameName = value;
                RaisePropertyChangedEvent("GameName");
            }

        }

        public string GameStatus
        {
            get { return _strGameStatus; }
            set {
                _strGameStatus = value;
                RaisePropertyChangedEvent("GameStatus");
            }
        }

        public void ShiftState()
        {
            thisYatzy.GameStatus.NextAround();

            GameStatus = thisYatzy.GameStatus.ToString();

        }
    }
}

Модель YatzyGameCL.DLL

Способы бытьиспользуется для создания фреймворка "вместе"

  • thisYatzy.GameStatus
  • thisYatzy.GameName

1 Ответ

0 голосов
/ 21 февраля 2019

Это будет трудно выразить кратко.Вы должны пойти и прочитать шаблон MVVM (Model-View-ViewModel).Хотя не обязательно использовать MVVM с WPF, для того, что вы делаете, это действительно то, что вам нужно.

В частности:

У вас есть созданная модель.Это ваша YatzyGame.Он знает, как работает Яци, имеет все правила.Это "игра".

У вас есть вид.Это ваш файл XAML (и код позади).Он знает, как рисовать экран, и знает, как делать обновления, если ему говорят о них.

Но ... у вас нет ViewModel.Это мост между двумя мирами.Он знает, как сказать вид для обновления.Ваша модель не (и не должна) знать, как это сделать, поэтому представление (экран) никогда не меняется.

Очень конкретный ответ на ваш вопрос заключается в том, что вам нужно отправлять уведомления об изменении свойств, чтобычто представление знает, что свойство (например, GameStatus) изменилось.У вас будет соблазн сделать это в вашей модели.Не делай этого.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...