从另一个ViewModel更改ViewModel的属性

时间:2018-09-01 21:32:12

标签: c# wpf mvvm caliburn.micro

我在MainView.xaml上有一个ListBox,选择Item会强制ContentControl显示不同的UserControl。我在此程序中使用Caliburn.Micro库。这是一些代码:

    <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}" />

MainViewModel.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; }

ItemsModel.cs

    public class ItemsModel
    {
        public string Name { get; set; }
        public object Content { get; set; }
    }

最后是 TextChangerViewModel.cs

    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.cs中更改MainViewModel.cs中的TextBlock1Text(以及.xaml中TextBlock的Text值)?我当时正在考虑在我的Items ObservableCollection上使用类似NotifyCollectionChanged的方法,但是它可以与ItemsModel的集合一起使用,而不是与VM的集合一起工作,所以我被困在这里。

我也不确定如果我以MVVM模式为目标,则在ItemsModel.cs中使用public object Content { get; set; }是否是一件好事,但是我不知道另一种方式(我非常MVVM的新功能)。

UPD

我正在寻找属性更改方式,因为我需要从另一个UserControl更改TextBlock1Text文本。假设我在 TextChangerView.xaml 上有按钮:<Button Grid.Row="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="Change da text" cal:Message.Attach="ChangeTextButton"/>

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

1 个答案:

答案 0 :(得分:0)

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

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

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