Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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# 显示基于数据绑定viewmodel类型的控件?_C#_Wpf_Xaml - Fatal编程技术网

C# 显示基于数据绑定viewmodel类型的控件?

C# 显示基于数据绑定viewmodel类型的控件?,c#,wpf,xaml,C#,Wpf,Xaml,我现在正在学习WPF。我发现xaml很难使用。我有如下定义的MainWindow.xaml: <Window x:Class="Compliance.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWind

我现在正在学习WPF。我发现xaml很难使用。我有如下定义的
MainWindow.xaml

<Window x:Class="Compliance.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ResourceDictionary Source="MainWindow.Resources.xaml"></ResourceDictionary>
    </Window.Resources>
    <Grid>
    </Grid>
</Window>
<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:Compliance.ViewModel"
    xmlns:vw="clr-namespace:Compliance.View">

    <DataTemplate DataType="{x:Type vm:Entities.AbstractEntityViewModel}">
        <vw:AbstractEntityView></vw:AbstractEntityView>     
    </DataTemplate>        
</ResourceDictionary>
<UserControl x:Class="Compliance.View.AbstractEntityView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <StackPanel>
        <Label Content="ID:"></Label>
        <TextBlock Text="{Binding Path=EntityId}"></TextBlock>
    </StackPanel>
</UserControl>
MainWindow window = new MainWindow();

    //Model class
Individual ind = new Individual(1,"Name");

    //subclass of AbstractEntityViewModel
var vm = new Entities.IndividualEntityViewModel(ind);

window.DataContext = vm;
window.Show();
AbstractEntityView
是这样的:

<Window x:Class="Compliance.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ResourceDictionary Source="MainWindow.Resources.xaml"></ResourceDictionary>
    </Window.Resources>
    <Grid>
    </Grid>
</Window>
<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:Compliance.ViewModel"
    xmlns:vw="clr-namespace:Compliance.View">

    <DataTemplate DataType="{x:Type vm:Entities.AbstractEntityViewModel}">
        <vw:AbstractEntityView></vw:AbstractEntityView>     
    </DataTemplate>        
</ResourceDictionary>
<UserControl x:Class="Compliance.View.AbstractEntityView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <StackPanel>
        <Label Content="ID:"></Label>
        <TextBlock Text="{Binding Path=EntityId}"></TextBlock>
    </StackPanel>
</UserControl>
MainWindow window = new MainWindow();

    //Model class
Individual ind = new Individual(1,"Name");

    //subclass of AbstractEntityViewModel
var vm = new Entities.IndividualEntityViewModel(ind);

window.DataContext = vm;
window.Show();
但是,窗口中没有显示任何内容

我使用来自的答案来获取要渲染的控件。但是,这需要从代码中引用视图中的元素,我不想这样做


是否可以获取一个窗口,根据ViewModel集作为其datacontext来拾取要渲染的视图?或者我对MVVM应该如何工作的想法是错误的吗?

您的想法是正确的,但实际上您并没有告诉WPF在任何地方显示您的
视图模型

如果绑定到单个ViewModel,我通常在
ContentControl
对象中托管一个
ViewModel

<Window x:Class="Compliance.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ResourceDictionary Source="MainWindow.Resources.xaml"></ResourceDictionary>
    </Window.Resources>
    <Grid>
        <ContentControl Content="{Binding }" />
    </Grid>
</Window>

很好,谢谢。我的窗口定义中出现了一行
DataContext=“{Binding RelativeSource={RelativeSource Self}}”
(我肯定我没有把它放在那里…),但一旦我删除了它,一切都正常了。@Oliver在绑定中引用
Self
,就会将绑定源设置为UI对象,不是它是
DataContext