C# 更改ViewModel';从另一个ViewModel中删除属性

C# 更改ViewModel';从另一个ViewModel中删除属性,c#,wpf,mvvm,caliburn.micro,C#,Wpf,Mvvm,Caliburn.micro,我在MainView.xaml上有一个列表框,选择该项将强制ContentControl显示不同的UserControl。我使用Caliburn.Micro库在这个Program中。下面是一些代码: <ListBox Grid.Row="1" Grid.Column="1" x:Name="ItemsListBox" SelectedItem="0" ItemsSource="{Binding Items}"> <ListBox.ItemTemplate

我在MainView.xaml上有一个列表框,选择该项将强制ContentControl显示不同的UserControl。我使用Caliburn.Micro库在这个Program中。下面是一些代码:

    <ListBox Grid.Row="1" Grid.Column="1" x:Name="ItemsListBox" SelectedItem="0" ItemsSource="{Binding Items}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding TextBlock1Text}" x:Name="TextBlock1"/>
    <ContentControl Grid.Row="3" Grid.Column="1" Content="{Binding ElementName=ItemsListBox, Path=SelectedItem.Content}" />
最后是文本changerviewmodel.cs

    private string _name;
    public string Name
    {
        get => _name;
        set
        {
            _name = value;
            NotifyOfPropertyChange(() => Name);
        }
    }
    private string _textBlock1Text;
    public string TextBlock1Text
    {
        get => _textBlock1Text;
        set
        {
            _textBlock1Text = value;
            NotifyOfPropertyChange(() => TextBlock1Text);
        }
    }
    public MainViewModel()
    {
        TextBlock1Text = "Test";
        Items = new ObservableCollection<ItemsModel>()
        {
            new ItemsModel { Name="Useless", Content=null },
            new ItemsModel { Name="TextChangerViewModel", Content=new TextChangerViewModel(TextBlock1Text) }
        };
    }
    public ObservableCollection<ItemsModel> Items { get; set; }
    public class ItemsModel
    {
        public string Name { get; set; }
        public object Content { get; set; }
    }
    public class TextChangerViewModel : Conductor<object>
{
    private string _textBlock1Text;

    public string TextBlock1Text
    {
        get => _textBlock1Text;
        set
        {
            _textBlock1Text = value;
            NotifyOfPropertyChange(() => TextBlock1Text);
        }
    }

    public TextChangerViewModel(string textBlock1Text) //passing parameter from another ViewModel
    {
        TextBlock1Text = textBlock1Text;
    }
}
公共类TextChangerViewModel:导体
{
私有字符串_textBlock1Text;
公共字符串TextBlock1Text
{
get=>_textBlock1Text;
设置
{
_textBlock1Text=值;
NotifyOfPropertyChange(()=>TextBlock1Text);
}
}
public TextChangerViewModel(string textBlock1Text)//从另一个ViewModel传递参数
{
TextBlock1Text=TextBlock1Text;
}
}
因此,主要问题是如何从TextChangerViewModel.cs更改MainViewModel.cs中的TextBlock1Text(以及.xaml中TextBlock的文本值)?我曾考虑在我的Items ObservableCollection上使用类似NotifyCollectionChanged的东西,但它可以用于ItemsModel的集合,而不是VM的集合,所以我被困在这里

如果我以MVVM模式为目标,我也不确定在ItemsModel.cs中使用
公共对象内容{get;set;}
是否是一件好事,但我不知道其他方法(我对MVVM非常陌生)

UPD

我正在寻找改变属性的方法,因为我需要改变另一个用户控件中的TextBlock1Text文本。假设我的文本ChangerView.xaml上有按钮:


单击它之后,我希望家长MainView.xaml上的文本发生更改。但问题是,我不知道在这种情况下如何更改属性,正如我在上面所写的原因。

更改textblox1的绑定以引用所选项目

<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding ElementName=ItemsListBox, Path=SelectedItem.Name}" x:Name="TextBlock1"/>



谢谢,这是一个很好的方法,但我正在寻找改变属性的方法。让我们来展开这个例子。假设我的TextChangerView.xaml上有一个按钮,我希望单击该按钮会导致TextBlock1Text(在父MainView.xaml上)文本发生更改。我也会更新这个问题,抱歉误解了。您是否正在尝试访问TextChangerViewModel中的属性?我添加了一个例子来说明这一点。是的,这似乎解决了我的问题,谢谢。这意味着我不需要MainViewModel.cs中的TextBlockText1属性?在VM中没有相应的属性(对于当前视图中的元素),但在辅助VM中有相应的属性,这似乎很奇怪。
<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding ElementName=ItemsListBox, Path=SelectedItem.Content.TextBlock1Text}" x:Name="TextBlock1"/>