Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在wpf中的窗口中设置多个Datacontext_C#_Wpf_Xaml_Mvvm_Datacontext - Fatal编程技术网

C# 如何在wpf中的窗口中设置多个Datacontext

C# 如何在wpf中的窗口中设置多个Datacontext,c#,wpf,xaml,mvvm,datacontext,C#,Wpf,Xaml,Mvvm,Datacontext,在应用程序中,我希望绑定来自两个不同ViewModel的数据。我必须将datacontext设置为两个不同的ViewModel 当我使用两个不同的ViewModel时,只有最后一组datacontext优先 因此,我有一个与其他viewmodel类组合的DataContext类 我可以更新到viewmodel,但它不能显示在视图上 视图模型1 public class Data1 : INotifyPropertyChanged { private string _str

在应用程序中,我希望绑定来自两个不同ViewModel的数据。我必须将datacontext设置为两个不同的ViewModel

当我使用两个不同的ViewModel时,只有最后一组datacontext优先

因此,我有一个与其他viewmodel类组合的DataContext类

我可以更新到viewmodel,但它不能显示在视图上

视图模型1

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;

    }
视图模型2

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,但绑定不起作用。我甚至尝试实例化内部属性,但没有成功。请帮我做这个

您不能绑定字段,所以只需将它们转换为属性,就可以了:

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();
}

为什么降级?哪里是
Data12
?查看输出窗口中的绑定错误。WPF绑定因吞咽异常和错误并将其隐藏在输出窗口中而臭名昭著。很抱歉,没有添加这些异常和错误。很抱歉,这是一个很好的起点:请注意,您还可以编写
public Data1 Data1{get;}=new Data1(),从而避免了对构造函数的需要。@Clemens谢谢,我正在考虑它,但我坚持使用VS 2012(不要问我为什么^^^),不想提供未经测试的代码。你做了什么特别的工作?我采用了相同的方法,但我的UI没有更新。@AshishJain如果要更新,可能需要实现
INotifyPropertyChanged
。这个问题是以一种方式写的,其中预先初始化的只读属性足够了。如果您添加的setter在构造函数之外的任何地方都可以使用,那么也可以添加一个属性。