Mvvm 似乎无法在视图之间进行通信

Mvvm 似乎无法在视图之间进行通信,mvvm,Mvvm,我已经编写了一个MVVM原型作为学习练习,我正在努力理解如何在视图之间进行交流 我在左边有一个树状视图(leftSideView) 右侧的列表视图(右侧视图) 主窗口(包括上述两个视图和一个拆分器) 我所实施的方法不起作用,如果你能指出我哪里出了问题,或者有更好的方法,我希望你能告诉我。 您可以从这里下载快速原型 当然,我对bindind做了些错事。 同时,了解你是如何做到这一点也很好。如 左边的列表框(一个视图)右边的列表视图(另一个视图)你如何在两者之间通信 谢谢你的建议我看了一下你的代码

我已经编写了一个MVVM原型作为学习练习,我正在努力理解如何在视图之间进行交流

我在左边有一个树状视图(leftSideView)

右侧的列表视图(右侧视图)

主窗口(包括上述两个视图和一个拆分器)

我所实施的方法不起作用,如果你能指出我哪里出了问题,或者有更好的方法,我希望你能告诉我。 您可以从这里下载快速原型

当然,我对bindind做了些错事。 同时,了解你是如何做到这一点也很好。如 左边的列表框(一个视图)右边的列表视图(另一个视图)你如何在两者之间通信


谢谢你的建议

我看了一下你的代码,做了如下所示的修改,它成功了。我把右边的视图改成了一个文本块来简化它

MainWindow.xaml.cs(为要绑定到的两个视图创建视图模型)

LeftSideView.xaml.cs(将此视图的数据上下文设置为视图模型,并在更改时更新视图模型的选定城市)

在RightSideView.xaml中,我只放置如下所示的文本框:

<TextBlock Text="{Binding SelectedCity.Details.City.Name}"/>

选择左视图中的城市后,它将更改视图模型中的选定城市,因此,它将更新右视图中的选定城市名称

以下是ProtoViewModel类的外观:

public class ProtoViewModel : Core.ViewModelBase
{
    public ProtoViewModel(IEnumerable<ContinentInfo> continents)
    {
        Continents =
            new ReadOnlyCollection<ContinentViewModel>(
                (from continent in continents
                 select new ContinentViewModel(continent)).ToList());
    }

    public ViewModels.CityViewModel SelectedCity
    {
        get { return selectedCity; }
        set
        {
            if(selectedCity != value)
            {
                selectedCity = value;
                OnPropertyChanged("SelectedCity");
            }
        }
    }
    private ViewModels.CityViewModel selectedCity;

    public ReadOnlyCollection<ContinentViewModel> Continents
    {
        get { return continents; }
        set
        {
            if (continents != value)
            {
                continents = value;
                OnPropertyChanged("Continents");
            }
        }
    }
    private ReadOnlyCollection<ContinentViewModel> continents;
}
公共类ProtoViewModel:Core.ViewModelBase
{
公共ProtoViewModel(IEnumerable大陆)
{
大陆=
新只读集合(
(来自大陆
选择新大陆视图模型(大陆)).ToList();
}
public view models.CityViewModel selected城市
{
获取{return selectedCity;}
设置
{
如果(selectedCity!=值)
{
selectedCity=值;
房地产变更(“选定城市”);
}
}
}
private ViewModels.CityViewModel selected城市;
公共只读收集大洲
{
获取{返回大陆;}
设置
{
如果(大陆!=价值)
{
大陆=价值;
财产变更(“大陆”);
}
}
}
各大洲的私人只读集合;
}

我将与您共享修改后的文件,但我不确定如何做到:)

我查看了您的代码,进行了如下所示的修改,并且成功了。我把右边的视图改成了一个文本块来简化它

MainWindow.xaml.cs(为要绑定到的两个视图创建视图模型)

LeftSideView.xaml.cs(将此视图的数据上下文设置为视图模型,并在更改时更新视图模型的选定城市)

在RightSideView.xaml中,我只放置如下所示的文本框:

<TextBlock Text="{Binding SelectedCity.Details.City.Name}"/>

选择左视图中的城市后,它将更改视图模型中的选定城市,因此,它将更新右视图中的选定城市名称

以下是ProtoViewModel类的外观:

public class ProtoViewModel : Core.ViewModelBase
{
    public ProtoViewModel(IEnumerable<ContinentInfo> continents)
    {
        Continents =
            new ReadOnlyCollection<ContinentViewModel>(
                (from continent in continents
                 select new ContinentViewModel(continent)).ToList());
    }

    public ViewModels.CityViewModel SelectedCity
    {
        get { return selectedCity; }
        set
        {
            if(selectedCity != value)
            {
                selectedCity = value;
                OnPropertyChanged("SelectedCity");
            }
        }
    }
    private ViewModels.CityViewModel selectedCity;

    public ReadOnlyCollection<ContinentViewModel> Continents
    {
        get { return continents; }
        set
        {
            if (continents != value)
            {
                continents = value;
                OnPropertyChanged("Continents");
            }
        }
    }
    private ReadOnlyCollection<ContinentViewModel> continents;
}
公共类ProtoViewModel:Core.ViewModelBase
{
公共ProtoViewModel(IEnumerable大陆)
{
大陆=
新只读集合(
(来自大陆
选择新大陆视图模型(大陆)).ToList();
}
public view models.CityViewModel selected城市
{
获取{return selectedCity;}
设置
{
如果(selectedCity!=值)
{
selectedCity=值;
房地产变更(“选定城市”);
}
}
}
private ViewModels.CityViewModel selected城市;
公共只读收集大洲
{
获取{返回大陆;}
设置
{
如果(大陆!=价值)
{
大陆=价值;
财产变更(“大陆”);
}
}
}
各大洲的私人只读集合;
}

<>我将与你分享修改后的文件,但我不知道如何做:(

< p>)你也可以考虑使用松散耦合的中介模式。例如,见:

MVVM轻型工具包中的Laurent Bugnon中介

MVVM基金会的信使

Prism事件聚合器


JouthTouter的ISCUKLSESN聚合器

,您也可以考虑使用松散耦合的中介模式。例如,见:

MVVM轻型工具包中的Laurent Bugnon中介

MVVM基金会的信使

Prism事件聚合器


Josh Twist的ISuckLessEventAggregator

你能用适当的语言来标记它吗?另外,如果可能的话,你可以只发布相关的片段,这样更容易快速查看。谢谢你的回复,我不知道要放多少片段。对不起。我开始把它们放在上面,这篇文章太长了。我会给它贴上标签。我很喜欢MVVM,并且认为它是合适的。你能用合适的语言给它贴上标签吗?另外,如果可能的话,你可以只发布相关的片段,这样更容易快速查看。谢谢你的回复,我不知道要放多少片段。对不起。我开始把它们放进去,帖子就这么长了。我会给它贴上标签。我很喜欢MVVM,觉得很合适。哇。让我消化一下,然后再给你回复。如果你想给我发电子邮件,你可以dotnet@devnet247.com但如果有麻烦也不用担心。我知道剥猫皮的方法很多,但你会这样做吗?只是想确定什么是正确的方法。我一直在读关于“信使”调解人模式等。。。如果你喜欢的话,只是不确定什么是“最佳实践”。哇。让我消化一下,然后再回来。如果你想给我发电子邮件,你可以dotnet@devnet247.com但如果有麻烦也不用担心。我知道有很多方法可以剥猫皮,但我会的
public class ProtoViewModel : Core.ViewModelBase
{
    public ProtoViewModel(IEnumerable<ContinentInfo> continents)
    {
        Continents =
            new ReadOnlyCollection<ContinentViewModel>(
                (from continent in continents
                 select new ContinentViewModel(continent)).ToList());
    }

    public ViewModels.CityViewModel SelectedCity
    {
        get { return selectedCity; }
        set
        {
            if(selectedCity != value)
            {
                selectedCity = value;
                OnPropertyChanged("SelectedCity");
            }
        }
    }
    private ViewModels.CityViewModel selectedCity;

    public ReadOnlyCollection<ContinentViewModel> Continents
    {
        get { return continents; }
        set
        {
            if (continents != value)
            {
                continents = value;
                OnPropertyChanged("Continents");
            }
        }
    }
    private ReadOnlyCollection<ContinentViewModel> continents;
}