У меня есть представление, которое содержит комбинированный список и ряд флажков, связанных с моделью представления с именем ProfileViewModel, которая имеет модель с именем Profile. Свойство combiteox selecteditem устанавливается в ProfileViewModel, называемое свойством selectedProfile. При выборе значения в выпадающем списке оно срабатывает и вызывает событие, которое подключается к совершенно другой модели представления, и это прекрасно работает. У меня также есть ряд флажков, свойства которых находятся в классе модели профиля. Я пытаюсь найти способ, когда свойства флажков меняются, я могу запустить одно и то же событие для другой модели представления, как я делаю с SelectProfile. Первоначально было событие в выбранном свойстве профиля, установленное на propertychange, но оно было запутанным, так как оно запускалось несколько раз для одного отдельного изменения, но работало при включении изменения флажка. Я изменил его для вызова, но он срабатывает только при изменении SelectedProfile. Может кто-нибудь объяснить чистый способ решить это?
<Grid Grid.Row="0">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
<Label Content="Profile:" Margin="2" Foreground="{DynamicResource Barclays.Text.Foreground.Highlight}" FontSize="15" VerticalAlignment="Center"/>
<ComboBox Margin="2" Height="25" Width="200" ItemsSource="{Binding Profiles}" SelectedItem="{Binding SelectedProfile, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=.Name}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<Button Content="Add" Opacity="90" ToolTip="Add Profile" Width="25" Height="25" Margin="2" Command="{Binding AddNewProfileCommand}"/>
<Button Content="Delete" Opacity="90" ToolTip="Delete Profile" Width="25" Height="25" Margin="2" Command="{Binding DeleteProfileCommand}"/>
<CheckBox Grid.Row="1" HorizontalAlignment="Stretch" Grid.Column="0" Grid.ColumnSpan="2" Margin="65,0,0,0" Content="Check 1" IsChecked="{Binding SelectedProfile.Checked1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<CheckBox Grid.Row="1" HorizontalAlignment="Stretch" Grid.Column="2" Grid.ColumnSpan="2" Margin="61,0,0,0" Content="Check 2" IsChecked="{Binding SelectedProfile.Checked2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<CheckBox Grid.Row="1" HorizontalAlignment="Stretch" Grid.Column="4" Grid.ColumnSpan="2" Margin="61,0,0,0" Content="Check 3" IsChecked="{Binding SelectedProfile.Checked3, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</Grid>
c #
public class Profile : INotifyPropertyChanged
{
private bool _checked1;
private bool _checked2;
private bool _checked3;
public Profile(bool checked1 = false, bool checked2 = false, bool checked3 = false)
{
_checked1 = checked1;
_checked2 = checked2;
_checked3 = checked3?
}
public bool Checked1
{
get { return _checked1; }
set
{
_checked1 = value;
}
}
public bool Checked2
{
get { return _checked2; }
set
{
_checked2 = value;
}
}
public bool Checked3
{
get { return _checked3; }
set
{
_checked3 = value;
}
}
}
public class ProfileViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public event EventHandler ProfileEvent;
#region Command
public ICommand AddNewProfileCommand { get; private set; }
public ICommand DeleteProfileCommand
{
get { return new DelegateCommand(o => DeleteProfile(), o => SelectedProfile != null && SelectedProfile.Name != HedgeProfile.Default().Name); }
}
public ICommand RemoveAllFiltersCommand
{
get
{
return new DelegateCommand(o =>
{
_selectedProfile.RemoveAllFilters();
PropertyChanged.Notify(() => SelectedProfile);
}, o => true);
}
}
#endregion
#region Properties
private HedgeProfile _selectedProfile;
public HedgeProfile SelectedProfile
{
get {
return _selectedProfile;
}
set
{
//if (_selectedProfile != null)
// _selectedProfile.PropertyChanged -= SelectedProfilePropertyChanged;
//_selectedProfile = value;
//if (_selectedProfile != null)
// _selectedProfile.PropertyChanged += SelectedProfilePropertyChanged;
//SaveHedgeProfiles();
//PropertyChanged.Notify(() => SelectedProfile);
_selectedProfile = value;
SaveHedgeProfiles();
HedgeProfileEvent?.Invoke(this, EventArgs.Empty);
}
}
private ObservableCollection<Profile> _profiles;
public ObservableCollection<Profile> Profiles
{
get { return _profiles; }
}
#endregion
public HedgeProfileViewModel(ICommand addProfileCommand)
{
LoadHedgeProfiles();
AddNewProfileCommand = addProfileCommand;
}
#region Events
private void SelectedProfilePropertyChanged(object sender, PropertyChangedEventArgs e)
{
PropertyChanged.Notify(() => SelectedProfile);
}
#endregion
#region Methods
private void LoadHedgeProfiles()
{
//Loads Profile
}
private void DeleteHedgeProfile()
{
if (_selectedProfile.Name != Profile.Default().Name)
{
_profiles.Remove(_selectedProfile);
}
}
#endregion
}