如何将DataContext设置为多个类?

时间:2018-05-16 07:50:50

标签: c# .net wpf mvvm data-binding

所以我刚刚进入数据绑定& MVVM和我在这件事上遇到了一个小问题。

我有一个名为Player

的单独类的WPF项目

在我的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"/>

现在..让我们说我有另一个叫做我不知道的课程.Acheivments .. 如何将另一个控件的Text设置为该类的属性?我必须设置另一个DataContext,我不知道如何设置多个datacontexts。

问题: 如何正确设置两个datacontexts,以便将不同的类绑定到不同的控件?

2 个答案:

答案 0 :(得分:5)

您只能将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}" />

答案 1 :(得分:-3)

最好你创建不同的列表如下:

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

之后,用您的值填充此列表。

现在你需要在XMAL中为你的TextBox提供一个带有类播放器的DataTemplate。

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

最后,您可以将不同的列表绑定到不同的控件。

TbName.source = ListOne;
相关问题