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

У меня есть представление, которое содержит комбинированный список и ряд флажков, связанных с моделью представления с именем 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...