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
,而且还在学习。任何建议都是很好的
好的,如果你想在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的原样。