从没有MVVM的另一个UserControl禁用UserControl的ComboBox

时间:2016-01-05 06:42:16

标签: c# wpf combobox user-controls

我有UserControl Person_UCStudent_UCComboBox中有一个Student_UC,我想从Person_UC禁用它。 但它不起作用。我想在没有MVVM的情况下实现这一目标。

public partial class Person_UC : UserControl
{
    public Person_UC()
    {
        InitializeComponent();
        Student_UC su = new Student_UC();
        su.myComboBoxName.IsEnabled = false;
    }
}

1 个答案:

答案 0 :(得分:0)

没有MVVM,解决起来会很困难。您必须操纵当前使用的Student_UC的相同实例。

实际上,你正在实例化一个新的Student_UC并禁用它的ComboBox,但是你没有对你的变量“su”做任何事情。你把它分配到某个地方了吗?

基本上,每个UserControl应该有一个ViewModel,因此Person_UC的ViewModel和Student_UC的ViewModel。

警告,此解决方案要求您使用MVVM Light(https://mvvmlight.codeplex.com)等MVVM框架来发送消息。

一种标准方式是发送消息。将Person_UC的Loaded事件绑定到代码隐藏中的方法,如下所示:

<UserControl x:Class="YourAssembly.Person_UC"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Name="Person_UC"
        Loaded="Loaded">

    <Grid Name="RootGrid">        
    </Grid>
</UserControl>

并且:

public partial class Person_UC : UserControl
{
    public Person_UC()
    {
        InitializeComponent();
    }

    private void Loaded(object sender, RoutedEventArgs e)
    {
        //Use a Message to notify your Student_UC's ViewModel that you would like to disable its ComboBox
       Messenger.Default.Send<ChangeComboBoxEnabilityMessage>(new ChangeComboBoxEnabilityMessage(false));
    } 
}

然后,当您在Student_UC的ViewModel中收到消息时,您必须将此信息传递给视图。基本上,您可以将ComboBox的IsEnable属性绑定到其ViewModel中的属性,在收到消息时您将设置为false。

public class Student_UC_ViewModel : INotifyPropertyChanged
{
    public Student_UC_ViewModel()
    {
        //Register your message
        Messenger.Default.Register<ChangeComboBoxEnabilityMessage>(message => ComboBoxIsEnabled = message.ComboBoxIsEnabled);
    }

    private bool _comboBoxIsEnabled;
    public bool ComboBoxIsEnabled
    {
        get 
        {
            return _comboBoxIsEnabled;
        }

        set
        {
            _comboBoxIsEnabled = value;
           OnPropertyChanged("ComboBoxIsEnabled");
        }
    } 

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

你的消息类:

public class ChangeComboBoxEnabilityMessage : MessageBase
{
    public ChangeComboBoxEnabilityMessage(bool comboBoxEnabled)
    {
        ComboBoxIsEnabled = comboBoxEnabled;
    }

    public bool ComboBoxIsEnabled
    {
        get;
        set;
    } 
}

我允许您将Student_UC xaml中ComboBox的IsEnable属性绑定到其ViewModel的属性(即ComboBoxIsEnabled)。 不要忘记确保设置了DataContext:

public partial class Student_UC : UserControl
{
    public Person_UC()
    {
        InitializeComponent();
        DataContext = new Student_UC_ViewModel();
    }

    ...
}

另外,请注意绑定问题,在Visual Studio中查看输出控制台。