【问题标题】:How to set Multiple Datacontext in a window in wpf如何在 wpf 的窗口中设置多个 Datacontext
【发布时间】:2018-04-15 10:39:54
【问题描述】:

在应用程序中,我想绑定来自 2 个不同视图模型的数据。我必须将 datacontext 设置为两个不同的视图模型。

当我使用两个不同的视图模型时,只有最后一组数据上下文优先。

因此,我有一个带有其他视图模型类的 CombinedDataContext 类。

我可以更新到视图模型,但它没有显示在视图上。

ViewModel1

public class Data1 : INotifyPropertyChanged
    {
        private string _string1;

        public string String1
        {
            get { return _string1; }
            set { _string1 = value; onPropertyChnaged("String1"); }
        }

        private void onPropertyChnaged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

    }

ViewModel2

public class Data2 : INotifyPropertyChanged
    {
        private string _string2;

        public string String2
        {
            get { return _string2; }
            set { _string2 = value; onPropertyChnaged("String2");}
        }

        private void onPropertyChnaged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

    }

观看次数:

public partial class MainWindow : Window
    {
        Data12 d12 = new Data12 { };
        public MainWindow()
        {
            InitializeComponent();
            DataContext = d12;
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            ViewModel_1();
            ViewModel_2();
        }

        private void ViewModel_1()
        {
            var viewmodel = DataContext as Data12;
            viewmodel.Data1.String1 = textBox.Text;
        }
        private void ViewModel_2()
        {
            var viewmodel = DataContext as Data12;
            viewmodel.Data1.String1 = textBox.Text;
        }
}

组合视图模型:

class Data12
    {
        public Data1 Data1 = new Data1();
        public Data2 Data2= new Data2();
    }

Xaml 文件:

<Grid>

        <Label x:Name="label" HorizontalAlignment="Left" Margin="92,61,0,0" VerticalAlignment="Top" Content="{Binding Data1.String1}"  />

        <Label x:Name="label1" Content="{Binding Data2.String2}" HorizontalAlignment="Left" Margin="349,61,0,0" VerticalAlignment="Top" />
        <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="65,153,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="textBox1" HorizontalAlignment="Left" Height="23" Margin="360,153,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
        <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="205,246,0,0" VerticalAlignment="Top" Width="75" Click="button_Click" />
</Grid>

没有 Nullreference,但绑定不起作用。我什至尝试通过实例化内部属性,但没有奏效。请帮助我。

【问题讨论】:

标签: c# wpf xaml mvvm datacontext


【解决方案1】:

你不能绑定字段,所以只要把它们变成属性就可以了:

class Data12
{
    public Data12()
    {
        this.Data1 = new Data1();
        this.Data2 = new Data2();
    }
    public Data1 Data1 { get; private set; }
    public Data2 Data2 { get; private set; }
}

正如@Clemens 所说,这可以缩短为

class Data12
{
    public Data1 Data1 { get; } = new Data1();
    public Data2 Data2 { get; } = new Data2();
}

【讨论】:

  • 请注意你也可以写public Data1 Data1 { get; } = new Data1();,这样就不需要构造函数了。
  • @Clemens 谢谢,我正在考虑,但我坚持使用 VS 2012(不要问我为什么^^)并且不想提供未经测试的代码。
  • 你做了什么特别的事?我遵循相同的方式,但我的 UI 没有更新。
  • @AshishJain 如果你想更新,你可能需要实现INotifyPropertyChanged。这个问题是以某种方式编写的,其中预先初始化的只读属性就足够了。如果您添加一个在构造函数之外的任何地方使用的 setter,也请添加一个属性更改处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 2015-03-19
  • 2014-07-06
  • 2011-06-03
  • 2011-08-25
相关资源
最近更新 更多