Как мне установить DataContext для нескольких классов? - PullRequest
0 голосов
/ 16 мая 2018

Так что я только начинаю привязываться к данным и MVVM, и у меня возникла небольшая проблема с этой единственной вещью.

У меня есть проект WPF с отдельным классом, который называется Player

В моем MainWindow классе я устанавливаю DataContext для экземпляра этого Player класса

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

В этом классе у меня есть свойство, в котором я устанавливаю значение в конструкторе.

public class Player : INotifyPropertyChanged
    {
        private string _Firstname;

        public Player()
        {
            _Firstname = "William";
        }
        public string Firstname
        {
            get { return _Firstname; }
            set { _Firstname = value; }
        }


        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

И затем в XAML существует некоторая простая логика привязки данных для TextBox

<TextBox Name="TbName" HorizontalAlignment="Left" Height="23" Margin="243,119,0,0" TextWrapping="Wrap" Text="{Binding Path=Firstname}" VerticalAlignment="Top" Width="120"/>

Теперь .. Допустим, у меня был еще один класс, который я не знаю .. Достижения .. Как бы я установил Text другого элемента управления для свойства этого класса? Мне нужно было бы установить еще один DataContext, и я не знаю, как установить несколько точек данных.

ВОПРОС: Как правильно установить два объекта данных, чтобы я мог связывать разные классы с разными элементами управления?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Вы можете установить только свойство DataContext для одного объекта, но тип этого объекта может содержать несколько свойств, с которыми вы можете связать:

class ViewModel
{
    public Player Player { get; } = new Player();
    public Achievement Achievement { get; } = new Achievement();
}

public MainWindow()
{
    InitializeComponent();
    DataContext = new ViewModel();
}

XAML:

<TextBox Text="{Binding Path=Person.Firstname}" />
...
<TextBlock Text="{Binding Achievement.SomeProperty}" />
0 голосов
/ 16 мая 2018

Наилучшим образом вы создаете различные списки следующим образом:

  public ObservableCollection<Player> ListOne = new ObservableCollection<Player>();

, после этого вы заполняете этот список своими значениями.

теперь вам нужно предоставить свой TextBox в XMAL шаблон данных с шаблономКласс Player.

                  <TextBox.ItemTemplate>
                        <DataTemplate x:DataType="data:Bilder">
                            //Whatever you want to bind here.
                        </DataTemplate>
                    </TextBox.ItemTemplate>

В конце вы можете привязать различные списки к различным элементам управления.

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