Изменение свойства ViewModel из другой ViewModel - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть ListBox в моем MainView.xaml, выбор элемента заставляет ContentControl отображать различные UserControls. Я использую библиотеку 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;
    }
}

Итак, главный вопрос - как изменить TextBlock1Text (и также значение Text для TextBlock в .xaml) в MainViewModel.cs из TextChangerViewModel.cs? Я думал об использовании чего-то вроде NotifyCollectionChanged на моем Items ObservableCollection, но оно работает с коллекцией ItemsModel, а не с виртуальными машинами, поэтому я застрял здесь.

Я также не уверен, хорошо ли иметь public object Content { get; set; } в ItemsModel.cs, если я нацеливаюсь на шаблон MVVM, но я не знаю другого способа сделать это (я очень новичок в MVVM).

UPD

Я ищу способ изменения свойства, потому что мне нужно изменить TextBlock1Text Text из другого UserControl. Предположим, у меня есть кнопка на моем TextChangerView.xaml : <Button Grid.Row="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="Change da text" cal:Message.Attach="ChangeTextButton"/>

И после щелчка я хочу, чтобы текст в родительском MainView.xaml изменился. Но дело в том, что я не знаю, как изменить свойства в этом случае, как я писал выше, почему.

1 Ответ

0 голосов
/ 02 сентября 2018

Изменить привязку 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"/>
...