1

我如何将视图模型中的布尔值传递给视图并更改值。例如在我的视图模型中,我创建了一个 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,因此需要更改 boolload

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

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

我如何将bool负载更改为真或假以上所有只是快速示例,我认为这可能很简单,但是我不习惯WPF并且仍在学习。任何建议都会很棒

4

2 回答 2

1

好的,如果您想在 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));
    }
}
于 2013-08-05T16:23:46.827 回答
0

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

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

接着:

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 原样。

于 2013-08-05T17:10:29.093 回答