Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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# 不呈现用户控件内容_C#_Wpf_Mvvm - Fatal编程技术网

C# 不呈现用户控件内容

C# 不呈现用户控件内容,c#,wpf,mvvm,C#,Wpf,Mvvm,我在我的WPF应用程序中有以下代码,但当我更改下拉列表中的值时,没有看到任何用户控件内容。你能告诉我我缺少什么吗 MainWindow.xaml: <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:MainViewModel=

我在我的WPF应用程序中有以下代码,但当我更改下拉列表中的值时,没有看到任何用户控件内容。你能告诉我我缺少什么吗

MainWindow.xaml:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:MainViewModel="clr-namespace:Test.ViewModel"
        xmlns:ViewModel="clr-namespace:Test.ViewModel.AccountTypes"
        xmlns:View="clr-namespace:Test.View" x:Class="Test.MainWindow"
        xmlns:Views="clr-namespace:Test.View.AccountTypes"
        xmlns:v="clr-namespace:Test.View.AccountTypes"
        xmlns:vm="clr-namespace:Test.ViewModel.AccountTypes"
        Title="{Binding DisplayName, Mode=OneWay}" ResizeMode="CanResize" WindowStartupLocation="CenterScreen">
    <Window.DataContext>
        <MainViewModel:MainWindowViewModel/>
    </Window.DataContext>

    <Grid>

        <StackPanel Grid.Row="0"  HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Horizontal" Height="28" Width="auto" Margin="5,0,0,0">
            <ComboBox Width="360" Margin="1,0" ItemsSource="{Binding AccountTypes}" DisplayMemberPath="Code" SelectedValuePath="ID" SelectedItem="{Binding SelectedAccountType, Mode=TwoWay}" TabIndex="0" />
        </StackPanel>

        <ContentPresenter Content="{Binding CurrentViewModel}">
        <ContentPresenter.Resources>
                <DataTemplate DataType="{x:Type ViewModel:AC1ViewModel}">
                    <Views:AC1View/>
            </DataTemplate>
                <DataTemplate DataType="{x:Type ViewModel:AC2ViewModel}">
                    <Views:AC2View/>
            </DataTemplate>
        </ContentPresenter.Resources>
    </ContentPresenter>
        </Grid>

谢谢。

您有一个私有对象
\u CurrentViewModel
,一个名为
m\u CurrentViewModel
的东西(我不知道是什么,因为您漏掉了那个代码),还有一个公共属性
CurrentViewModel
,您已经绑定到ContentPresenter的内容属性

当您更改
m_currentViewModel
的值时,什么也不会发生,因为您没有告诉任何人您更改了它,而且它也没有绑定任何内容

您需要做的是将新的当前viewmodel分配给
CurrentViewModel
,因为这样会发生两件事:

  • CurrentViewModel
    的值将更改,因为其setter将
    value
    分配给
    \u CurrentViewModel
    ,其getter返回
    \u CurrentViewModel
    的值

  • 视图将知道
    CurrentViewModel
    的值已更改,因为
    CurrentViewModel
    的setter正确地引发了
    PropertyChanged
    。这将导致内容演示者更新其内容


您有一个私有对象
\u CurrentViewModel
,一个名为
m\u CurrentViewModel
的东西(我不知道是什么,因为您遗漏了该代码),以及一个公共属性
CurrentViewModel
,您已经绑定到ContentPresenter的内容属性

当您更改
m_currentViewModel
的值时,什么也不会发生,因为您没有告诉任何人您更改了它,而且它也没有绑定任何内容

您需要做的是将新的当前viewmodel分配给
CurrentViewModel
,因为这样会发生两件事:

  • CurrentViewModel
    的值将更改,因为其setter将
    value
    分配给
    \u CurrentViewModel
    ,其getter返回
    \u CurrentViewModel
    的值

  • 视图将知道
    CurrentViewModel
    的值已更改,因为
    CurrentViewModel
    的setter正确地引发了
    PropertyChanged
    。这将导致内容演示者更新其内容


从您的代码中我可以看出,您从未使用过
CurrentViewModel
属性,而是将
m_CurrentViewModel
私有成员设置为valorize。因此,
OnPropertyChanged(“CurrentViewModel”)
永远不会被激发,并且您的视图不会收到有关CurrentViewModel更改的通知

因此,请在SelectedAccountType属性中尝试设置CurrentViewModel:

public AccountType SelectedAccountType
{
    get
    {
        return m_selectedSearchAccountType;
    }
    set
    {
        m_selectedSearchAccountType = value;
        if (SelectedAccountType.Code == "AC1")
        {
            CurrentViewModel = new AC1ViewModel();
        }
        else if (SelectedAccountType.Code == "AC2")
        {
            CurrentViewModel = new AC2ViewModel();
        }
    }
}

从您的代码中我可以看出,您从未使用过
CurrentViewModel
属性,而是将
m_CurrentViewModel
private成员设置为valorize。因此,
OnPropertyChanged(“CurrentViewModel”)
永远不会被激发,并且您的视图不会收到有关CurrentViewModel更改的通知

因此,请在SelectedAccountType属性中尝试设置CurrentViewModel:

public AccountType SelectedAccountType
{
    get
    {
        return m_selectedSearchAccountType;
    }
    set
    {
        m_selectedSearchAccountType = value;
        if (SelectedAccountType.Code == "AC1")
        {
            CurrentViewModel = new AC1ViewModel();
        }
        else if (SelectedAccountType.Code == "AC2")
        {
            CurrentViewModel = new AC2ViewModel();
        }
    }
}

您是否通过其setter设置
CurrentViewModel
属性?否则将不会调用
OnPropertyChanged
。很难确定您在做什么。似乎在简化代码时犯了一些错误-未声明m_currentViewModel。这与_CurrentViewModel相同吗?还是CurrentViewModel属性?还是其他原因?是否通过setter设置
CurrentViewModel
属性?否则将不会调用
OnPropertyChanged
。很难确定您在做什么。似乎在简化代码时犯了一些错误-未声明m_currentViewModel。这与_CurrentViewModel相同吗?还是CurrentViewModel属性?还是别的?谢谢你的回答。我现在已经更新了上面问题中的代码。但是我总是看到AC1用户控件的内容,即使我在下拉值中选择了AC2。请告知。它仍然损坏,因为你没有做我建议的更改:“将新的当前viewmodel分配给CurrentViewModel”。你还在把它分配给别的东西@下面Alex的答案比我快了30秒,他提供了我刚才描述的实际代码更改。我99%确信这会解决问题;如果是这样,你应该接受他的回答为正确。谢谢你的回答。我现在已经更新了上面问题中的代码。但是我总是看到AC1用户控件的内容,即使我在下拉值中选择了AC2。请告知。它仍然被破坏,因为你没有做我建议的更改:“将新的当前viewmodel分配给CurrentViewModel”。你还在把它分配给别的东西@下面Alex的答案比我快了30秒,他提供了我刚才描述的实际代码更改。我99%确信这会解决问题;如果是这样,你应该认为他的回答是正确的。