Как элементы из привязок в ItemsControl могут взаимодействовать друг с другом без использования Messenger или EventAggregator. Ниже приведен упрощенный, но полный случай. Где у меня есть два связанных элемента в ItemsControl. UpdateTheSecondItemFromTheFirstItem() можно выполнить с помощью EventAggregator (мессенджер) в prism. Но мне интересно, есть ли более прямое решение для достижения этого без использования мессенджера. Главное окно:
<Window x:Class = "WpfApp2.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:prism = "http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel = "True"
mc:Ignorable = "d"
Title = "MainWindow" Height = "450" Width = "800">
<Grid>
<ItemsControl ItemsSource = "{Binding MyItems}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation = "Vertical">
</StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate DataType = "MyType">
<Grid>
<Slider Value = "{Binding MyNum}" Minimum = "0" Maximum = "100"></Slider>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
Мой тип
using Prism.Mvvm;
namespace WpfApp2
{
public class MyType : BindableBase
{
private bool _isFirstItem=false;
private int _myVar;
public int MyVar
{
get { return _myVar; }
set
{
if (Equals(_myVar, value)) return;
SetProperty(ref _myVar, value);
}
}
public MyType(bool isFirst)
{
_isFirstItem = isFirst;
MyVar = 0;
}
}
}
MainWindowViewModel
using Prism.Mvvm;
using System.Collections.ObjectModel;
namespace WpfApp2
{
public class MainWindowViewModel:BindableBase
{
private ObservableCollection<MyType> _myItems = new ObservableCollection<MyType>();
public ObservableCollection<MyType> MyItems
{
get { return _myItems; }
set
{
if (Equals(_myItems, value)) return;
SetProperty(ref _myItems, value);
if (_isFirstItem) UpdateTheSecondItemFromTheFirstItem();
}
}
private void UpdateTheSecondItemFromTheFirstItem(){
}
public MainWindowViewModel()
{
MyType[] MyTypeArr =
{
new MyType(true),
new MyType(false)
};
MyItems.AddRange(MyTypeArr);
}
}
}
Решение найдено, просто используйте ref, который точно такой же, как указатель в C++:
Модель MainWindowViewModel:
public MainWindowViewModel()
{
MyType Type1 = new MyType();
MyType Type2 = new MyType();
MyItems.Add(Type1);
MyItems.Add(Type2);
Type1.SetPair(ref Type2);
}
MyType.cs:
using Prism.Mvvm;
namespace WpfApp2
{
public class MyType : BindableBase
{
private int _myVar;
public int MyVar
{
get { return _myVar; }
set
{
if (Equals(_myVar, value)) return;
SetProperty(ref _myVar, value);
if (MyPair!=null)
{
MyPair.MyVar = value;
}
}
}
public MyType()
{
MyVar = 0;
}
MyType MyPair { get; set; }
public void SetPair(ref MyType pair)
{
MyPair = pair;
}
public MyType GetPair()
{
return MyPair;
}
}
}
Теперь при перетаскивании ползунка второй ползунок будет двигаться вместе с первым ползунком.