如何使用MVVM填充具有访问权限的组合框

时间:2015-05-19 20:03:48

标签: c# wpf xaml mvvm combobox

我是C#的新手,我正在尝试使用MVVM模式创建代码,但我不知道如何使用该模式填充组合框。请帮我创建ViewModel和绑定到xaml。

代码模型:

 public int Cd_Raca
    {
        get;
        set
        {
            if(Cd_Raca != value)
            {
                Cd_Raca = value;
                    RaisePropertyChanged("Cd_Raca");
            }
        }
    }

    public string Nm_Raca
    {
        get;
        set
        {
            if(Nm_Raca != value)
            {
                Nm_Raca = value;
                    RaisePropertyChanged("Nm_Raca");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string property)
    {
        if(PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

的Xaml:

<ComboBox x:Name="dsCmbRaca" HorizontalAlignment="Left" Margin="438,4,0,0"
                             VerticalAlignment="Top" Width="94" Height="19"/>

1 个答案:

答案 0 :(得分:0)

使用ItemsSource属性并将其设置为对象的枚举。使用DisplayMemberPath,如果列表不仅仅是字符串列表,您可以将其设置为列表中单个对象的属性。
即在我的示例中,列表的对象具有用于显示的Description属性和用于所选值的Value属性。

示例中的所有绑定都必须是ViewModel(= DataContext)中的属性。

<ComboBox DisplayMemberPath="Description" HorizontalAlignment="Left" 
                  VerticalAlignment="Top" Width="120"
                  ItemsSource="{Binding myList}"
                  SelectedValue="{Binding mySelectedValue}" SelectedValuePath="Value" />  

编辑:
List属性可能如下所示:

    public IList<MyObject> myList { get { return new List<MyObject>();} }

对象可能看起来像这样:

public class MyObject
{
    public string Description { get; }
    public enum Value { get;}
}

对象是可选的。你可以传递一个字符串列表。

免责声明:我在记事本中攻击了这个。我希望它可以编译。

<强>更新
至少根据您发布的属性查看代码未正确实现。如果您按照以下方式对其进行编码,则需要一个支持字段:

private int _cd_Raca;
private string _nm_Raca;

public int Cd_Raca
    {
        get{ return _cd_Raca;}
        set
        {
            if(_cd_Raca != value)
            {
                _cd_Raca = value;
                    RaisePropertyChanged("Cd_Raca");
            }
        }
    }

    public string Nm_Raca
    {
        get{return _nm_Raca;}
        set
        {
            if(_nm_Raca != value)
            {
                _nm_Raca = value;
                    RaisePropertyChanged("Nm_Raca");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string property)
    {
        if(PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

在第一个答案中阅读您的评论似乎您可能有一个特定的用例。因此,如果此更新无效,您可以在问题中添加更多信息。