C#WPF MVVM:与代码隐藏属性的多重绑定未处理正确的更新值
我有一个WPF按钮,它的“IsEnabled”属性绑定到“ReadOnly”后面的代码中的属性和“Enabled”视图模型中的属性: 查看(我只发布我想关注的重要部分,不在此处发布视图中的其他组件):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
代码隐藏:
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的视图模型。然后从代码隐藏更新它,因为我决定此属性是否为真的逻辑在代码隐藏中