WPF C#绑定行为异常

时间:2018-01-09 09:47:13

标签: c# wpf xaml mvvm data-binding

所以我有一个带有默认布局的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

2 个答案:

答案 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