WPF将bool传递给视图并对其进行更改

本文关键字:视图 bool WPF | 更新日期: 2023-09-27 18:26:26

如何将bool从视图模型传递到视图并更改值。例如,在我的视图模型中,我创建了一个bool

public bool load
{
    get { return m_load; }
    set
    {
        m_load = value;
        OnPropertyChanged(this, o => o.load);
    }
}

然后我有我的SelectedVm代码

public ViewModel SelectedVm
{
    get { return _selectedVm; }
    set
    {        
        _selectedVm = value;
        if (_selectedVm != null && load == true)
        {
            _selectedVm.Load();                   
        }
        Load = false;
        OnPropertyChanged(this, o => o.SelectedVm);               
    }
}

在我看来,SelectedVm绑定了两次,但我只希望在其中一个绑定上调用Load,因此需要更改bool load

所以在我看来,如果我有以下

<ListView Grid.Row="1"  Name="Sample"  
          ItemsSource="{Binding Path=SampleViewModel}"  
          SelectedItem="{Binding SelectedVm, Mode=TwoWay}"     
          IsSynchronizedWithCurrentItem="True" Width="500">            
</ListView>

如何将bool加载更改为true或false上面所有的都只是快速的样本,我认为这可能很简单,但我还不太习惯WPF,而且还在学习。任何建议都是很好的

WPF将bool传递给视图并对其进行更改

好的,如果你想在View中获得Load的值,并且你想在纯MVVM模式中进行,那么在View中创建bool类型的DependencyProperty,并将其绑定到像一样的VM的Load属性

public partial class MainWindow : Window
{
    public static readonly DependencyProperty LoadProperty = DependencyProperty.Register("MyCustom", typeof(bool), typeof(MainWindow), new PropertyMetadata(new PropertyChangedCallback(LoadPropertyChangedCallback)));
    public bool Load
    {
        get
        {
            return (bool)this.GetValue(LoadProperty) ;
        }
        set
        {
            this.SetValue(LoadProperty, value);
        }
    }
    static void LoadPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    { 
        //Do your load stuff here
    }
    public MainWindow()
    {
        InitializeComponent();
        this.SetBinding(LoadProperty, new Binding("load"));
        DataContext = new ViewModel();
    }
}
public class ViewModel : INotifyPropertyChanged
{
    public ViewModel()
    {
        load = true;
    }
    bool m_load;
    public bool load
    {
        get { return m_load; }
        set
        {
            m_load = value;
            OnPropertyChanged("load");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
}

您发布的代码确保Load()被调用一次,即使有多个绑定。

如果我正确理解你的真实问题,那么你实际上是在寻求一种方法来确保每个SelectedVM调用Load()函数一次,而且只调用一次。对吧
如果是这样的话,您需要将bool属性添加到ViewModel类,而不是主类,仅此而已。

然后:

public ViewModel SelectedVm
{
    get { return _selectedVm; }
    set
    {        
        _selectedVm = value;
        if (_selectedVm != null && _selectedVm.load == true)
        {
           _selectedVm.Load();                   
           _selectedVm.load = false;
        }
        OnPropertyChanged(this, o => o.SelectedVm);               
    }
}

您可以保持XAML的原样。