所以我有一个带有默认布局的c#wpf应用程序和不同的UserControls
来填充该布局的一部分。到目前为止,一切都像绑定属性的魅力,但现在我创建了另一个UserControl
绑定似乎只有OneWay
。
查看 - > ViewModel 效果很好,我可以跟踪按钮点击,检查组合框以及所有这些内容,但是...
ViewModel - >查看根本不想工作。
我尝试将绑定模式设置为TwoWay
并将UpdateSourceTrigger
设置为PropertyChanged
,但没有任何变化。
这是我的观点:
<UserControl ...
xmlns:vm="clr-namespace:Prueftool.BBCCreatorViewModel"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.DataContext>
<vm:CreateDisplayTypeViewModel/>
</UserControl.DataContext>
<Grid>
<Button Content="Button" Width="75" Command="{Binding TestButtonClick}"/>
<CheckBox Content="CheckBox" IsChecked="{Binding TestIsChecked}"/>
</Grid>
</UserControl>
这是我引用的ViewModel:
namespace Prueftool.BBCCreatorViewModel
{
class CreateDisplayTypeViewModel : ViewModelBase, ICreateDisplayViewModel
{
private bool _testIsChecked;
public bool TestIsChecked
{
get { return _testIsChecked; }
set
{
_testIsChecked = value;
OnPropertyChanged("TestIsChecked");
}
}
public void SetNewDisplayType(DisplayType selectedDisplayType)
{
if(selectedDisplayType.Name == "Default")
{
TestIsChecked = true;
}
}
private DelegateCommand _random;
public ICommand RandomButtonClick
{
get
{
if (_random == null)
{
_random = new DelegateCommand(randomButtonClick);
}
return _random;
}
}
private void randomButtonClick()
{
if(TestIsChecked)
{
MessageBox.Show("Hello World");
}
}
}
}
正在调用SetNewDisplayType
方法并且if语句为true,但它不会在视图中检查我的组合框。另一方面,手动检查组合框然后按下按钮会触发randomButtonClick
方法并显示MessageBox。
编辑:
OnPropertyChanged方法(不是我的)
#region public virtual void OnPropertyChanged()
/// <summary>
/// Raises this object's PropertyChanged event.
/// </summary>
/// <param name="propertyName">The property that has a new value.</param>
public virtual void OnPropertyChanged(string propertyName)
{
this.VerifyPropertyName(propertyName);
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
#endregion
答案 0 :(得分:1)
我认为您可能在CreateDisplayTypeViewModel的不同实例上调用SetNewDisplayType而不是用作DataContext的实例。当我使用UserControl并将构造函数更改为
时,将检查绑定是否正常以及复选框public MyUserControl()
{
InitializeComponent();
((CreateDisplayTypeViewModel)DataContext).SetNewDisplayType();
}
和SetNewDisplayType
到
public void SetNewDisplayType()
{
TestIsChecked = true;
}
如果您可以发布如何调用此函数,那将会有所帮助。
编辑:OnPropertyChanged中的处理程序为空(正如您在上面的注释中所提到的)这一事实也暗示您可能正在使用VM的两个实例。
答案 1 :(得分:0)
我认为您只需在课堂上实施 INotifyPropertyChanged 。
class CreateDisplayTypeViewModel : ViewModelBase, ICreateDisplayViewModel, INotifyPropertyChanged
我看到你有 OnPropertyChanged 方法,但你还需要实现 PropertyChangedEventHandler 。这样的事情应该这样做:
#region Public Events
public event PropertyChangedEventHandler PropertyChanged;
#endregion Public Events
#region Protected Methods
protected void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
#endregion Protected Methods