C#WPF MVVM:与代码隐藏属性的多重绑定未处理正确的更新值

C#WPF MVVM:与代码隐藏属性的多重绑定未处理正确的更新值,c#,wpf,mvvm,binding,multibinding,C#,Wpf,Mvvm,Binding,Multibinding,我有一个WPF按钮,它的“IsEnabled”属性绑定到“ReadOnly”后面的代码中的属性和“Enabled”视图模型中的属性: 查看(我只发布我想关注的重要部分,不在此处发布视图中的其他组件): 代码隐藏: namespace WpfApplication1 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial

我有一个WPF按钮,它的“IsEnabled”属性绑定到“ReadOnly”后面的代码中的属性和“Enabled”视图模型中的属性:

查看(我只发布我想关注的重要部分,不在此处发布视图中的其他组件):


代码隐藏

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            DataContext = new myViewModel();

            InitializeComponent();

            if (someCondition)
                 this.ReadOnly = true;
            else
                 this.ReadOnly = false; 
        }

        private bool readOnly = true;
        public bool ReadOnly
        {
            get
            {
                return this.readOnly;
            }

            set
            {
                if (this.readOnly == value)
                    return;

                this.readOnly = value;
            }
        }

    }
}
namespace WpfApplication1.Converters
{
    public class BooleanAndConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            //foreach (object value in values)
            //{
            //    if ((value is bool) && (bool)value == false)
            //    {
            //        return false;
            //    }
            //}

            if (values != null)
            {
                if (values[0] is bool && values[1] is bool)
                {
                    bool vmState = (bool)values[0];
                    bool readOnly = (bool)values[1];  // <--- HERE readOnly always is true

                    return (vmState && !readOnly);
                }
                return false;
            }

            return false;
        }
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotSupportedException("BooleanAndConverter is a OneWay converter.");
        }
    }
}
命名空间WpfApplication1
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
DataContext=新的myViewModel();
初始化组件();
如果(某些条件)
this.ReadOnly=true;
其他的
this.ReadOnly=false;
}
private bool readOnly=true;
公共bool只读
{
得到
{
返回此文件。只读;
}
设置
{
if(this.readOnly==值)
返回;
this.readOnly=值;
}
}
}
}
转换器

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            DataContext = new myViewModel();

            InitializeComponent();

            if (someCondition)
                 this.ReadOnly = true;
            else
                 this.ReadOnly = false; 
        }

        private bool readOnly = true;
        public bool ReadOnly
        {
            get
            {
                return this.readOnly;
            }

            set
            {
                if (this.readOnly == value)
                    return;

                this.readOnly = value;
            }
        }

    }
}
namespace WpfApplication1.Converters
{
    public class BooleanAndConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            //foreach (object value in values)
            //{
            //    if ((value is bool) && (bool)value == false)
            //    {
            //        return false;
            //    }
            //}

            if (values != null)
            {
                if (values[0] is bool && values[1] is bool)
                {
                    bool vmState = (bool)values[0];
                    bool readOnly = (bool)values[1];  // <--- HERE readOnly always is true

                    return (vmState && !readOnly);
                }
                return false;
            }

            return false;
        }
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotSupportedException("BooleanAndConverter is a OneWay converter.");
        }
    }
}
namespace WpfApplication1.Converters
{
公共类BooleanAndConverter:IMultiValueConverter
{
公共对象转换(对象[]值,类型targetType,对象参数,System.Globalization.CultureInfo区域性)
{
//foreach(值中的对象值)
//{
//如果((值为bool)&(bool)值==false)
//    {
//返回false;
//    }
//}
如果(值!=null)
{
如果(值[0]为布尔值&&值[1]为布尔值)
{
bool vmState=(bool)值[0];

bool readOnly=(bool)values[1];//是的,您必须实现INotifyPropertyChanged或将其作为依赖项属性,除非您设置此属性的唯一位置是构造函数。在这种情况下,只需在InitializeComponent()之前移动其初始化您还应该签出MVVM模式,并将ReadOnly属性移动到ViewModel实现的ViewModelINotifyPropertyChanged@Evk是,自我选中用户角色以来,此属性仅在代码隐藏中第一次更新。如果用户角色与管理员角色不同,例如查看器角色,则我禁用某些组件(按钮)在视图中。然后不再从任何位置更新。因此,通过移动“只读”initializeComponent之前的属性初始化对我来说是可行的。唯一的缺点是记住在初始化之前进行初始化,不要忘记,在以后初始化之后再移动它。所以我也会查看依赖属性。@Evk关于INotifyPropertyChanged,我不想在代码中实现它d、 更好的视图模型。@Steve是的,另一种可能是将此代码隐藏属性移动到实现INotifyPropertyChanged的视图模型。然后从代码隐藏更新它,因为我决定此属性是否为真的逻辑在代码隐藏中