【问题标题】:Silverlight add Binding To ControlsSilverlight 添加绑定到控件
【发布时间】:2011-05-27 13:17:22
【问题描述】:
public class Person

    {

    private int _Id;
    public int Id{get{return value;} set{_Id=value;}}

    private string _Code
    public  string Code{get{return _Code;} set {_Code=value;}}

    private string _Name;
    public string Name{get{return _Name;}set{_Name=value;}}

    } 

这是我的模型类

我的表单中有两个 Combobox。Combo1 和 Combo2。 Combo1 DisplayMember 代码 ValueMember Id
Combo2 DisplayMember 名称 ValueMember Id

当我更改代码或命名另一个组合框编辑值并显示值更改时,我想这样做

【问题讨论】:

    标签: c# silverlight


    【解决方案1】:

    我建议进行一些更改:

    首先,您可能希望将 person 类分成两个类:Code 和 Person

    public class Person
    {
        public int Id { get; set; }
        public int CodeId { get; set; }
        public string Name { get; set; }
    }
    
    public class Code
    {
        public int Id { get; set; }
        public string CodeText { get; set; }
    }
    

    然后创建一个您将设置为视图数据上下文的类,在 MVVM 设计模式中通常称为视图模型:

    public class Data : INotifyPropertyChanged
    {
        public List<Person> People { get; set; }
        public List<Code> Codes { get; set; }
    
        private Code _selectedCode;
        public Code SelectedCode
        {
            get
            {
                return _selectedCode;
            }
            set
            {
                _selectedCode = value;
                PropertyChanged(this, new PropertyChangedEventArgs("SelectedCode"));
                SelectedPeople = People.Where(p => p.CodeId == SelectedCode.Id).ToList();
            }
        }
    
        private List<Person> _selectedPeople;
        public List<Person> SelectedPeople
        {
            get
            {
                return _selectedPeople;
            }
            set
            {
                _selectedPeople = value;
                PropertyChanged(this, new PropertyChangedEventArgs("SelectedPeople"));
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    }
    

    注意它实现了 INotifyPropertyChanged。这对于 Silverlight 中的绑定至关重要。在 MainPage.xaml.cs 的构造函数中:

    Data data = new Data
        {
            Codes = new List<Code>(),// populate your codes
    
            People = new List<Person>() // populate your people, giving them correct codeids
        }
    
    this.DataContext = data;
    

    现在在您视图的 XAMl 中:

    <ComboBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" ItemsSource="{Binding Codes}" SelectedItem="{Binding SelectedCode, Mode=TwoWay}" DisplayMemberPath="CodeText" />
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="12,54,0,0" Name="comboBox2" VerticalAlignment="Top" Width="120" ItemsSource="{Binding SelectedPeople}" DisplayMemberPath="Name" />
    

    请注意,第一个组合框绑定到 DataContext 上的 Codes 集合。 selectedItem 属性TWO-WAY 绑定到数据上下文的 SelectedCode 属性。当用户更改所选项目时,将调用 datacontext 上的 setter。我们更新了要显示的人员列表,并引发了 PropertyChanged 事件,通知视图它需要更新人员框。

    当然,如果你正确地实现了 MVVM 设计模式,这会更加简洁。我喜欢为此使用 MVVM Light 工具包。

    我知道那是冗长的,但我想引导您走上正确的道路,以便您可以在这个项目和未来使用这些知识:)

    【讨论】:

    • 感谢您的回答,但如果我想从 DAtaContext Adonet 实体数据模型中进行此操作,当我将项目源提供给组合框时,我应该为 DataBinding 提供什么
    • 我强烈建议您对 MVVM 设计模式进行一些研究。本质上,您有一个将视图 (XAML) 绑定到的视图模型。在此视图模型中,您将拥有 UI 元素将绑定到的集合。在您的视图模型中,您将使用来自实体框架的任何内容填充这些集合。看看吧,它会让你的编码更简洁:silverlight.net/learn/videos/silverlight-4-videos/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2010-12-20
    • 2013-02-21
    • 2011-11-22
    • 2010-12-06
    • 1970-01-01
    • 2011-08-23
    相关资源
    最近更新 更多