यहां एक उदाहरण है जो यूआई में किसी ऑब्जेक्ट और कुछ पूर्वजों को बांधता है; यहां सी # 3.0 का उपयोग पूरी तरह से ब्रेवटी के लिए है - सब कुछ सी # 2.0 के साथ भी काम करेगा। महत्वपूर्ण बात , वहाँ अद्यतन करने ऑब्जेक्ट मॉडल, या ऑब्जेक्ट मॉडल से यूआई के लिए समर्पित किसी भी कोड नहीं है -
कोड यहाँ के अधिकांश रूप स्थापित कर रही है, और/या संपत्ति परिवर्तन सूचनाओं के साथ काम यूआई से।
यह भी ध्यान रखें आईडीई डेटा-बाइंडिंग कोड का एक बहुत आप के लिए, बस संपत्ति ग्रिड में प्रपत्र पर एक BindingSource छोड़ने और संवाद के माध्यम से एक प्रकार के डेटा स्रोत की स्थापना करके कर सकते हैं।
ध्यान दें कि यह जरूरी संपत्ति परिवर्तन प्रदान करने के लिए सूचनाएं (PropertyChanged सामान) नहीं है - हालांकि, सबसे 2 तरह यूआई बंधन काफी बेहतर यदि आप ऐसा काम करेंगे यह लागू। ऐसा नहीं है कि पोस्टशर्प में कुछ न्यूनतम कोड के साथ ऐसा करने के दिलचस्प तरीके हैं।
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Windows.Forms;
using System.Xml.Serialization;
static class Program { // formatted for vertical space
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Button load, save, newCust;
BindingSource source = new BindingSource { DataSource = typeof(Customer) };
XmlSerializer serializer = new XmlSerializer(typeof(Customer));
using (Form form = new Form {
DataBindings = {{"Text", source, "Name"}}, // show customer name as form title
Controls = {
new DataGridView { Dock = DockStyle.Fill, // grid of orders
DataSource = source, DataMember = "Orders"},
new TextBox { Dock = DockStyle.Top, ReadOnly = true, // readonly order ref
DataBindings = {{"Text", source, "Orders.OrderRef"}}},
new TextBox { Dock = DockStyle.Top, // editable customer name
DataBindings = {{"Text", source, "Name"}}},
(save = new Button { Dock = DockStyle.Bottom, Text = "save" }),
(load = new Button{ Dock = DockStyle.Bottom, Text = "load"}),
(newCust = new Button{ Dock = DockStyle.Bottom, Text = "new"}),
}
})
{
const string PATH = "customer.xml";
form.Load += delegate {
newCust.PerformClick(); // create new cust when loading form
load.Enabled = File.Exists(PATH);
};
save.Click += delegate {
using (var stream = File.Create(PATH)) {
serializer.Serialize(stream, source.DataSource);
}
load.Enabled = true;
};
load.Click += delegate {
using (var stream = File.OpenRead(PATH)) {
source.DataSource = serializer.Deserialize(stream);
}
};
newCust.Click += delegate {
source.DataSource = new Customer();
};
Application.Run(form);
}
}
}
[Serializable]
public sealed class Customer : NotifyBase {
private int customerId;
[DisplayName("Customer Number")]
public int CustomerId {
get { return customerId; }
set { SetField(ref customerId, value, "CustomerId"); }
}
private string name;
public string Name {
get { return name; }
set { SetField(ref name, value, "Name"); }
}
public List<Order> Orders { get; set; } // XmlSerializer demands setter
public Customer() {
Orders = new List<Order>();
}
}
[Serializable]
public sealed class Order : NotifyBase {
private int orderId;
[DisplayName("Order Number")]
public int OrderId {
get { return orderId; }
set { SetField(ref orderId, value, "OrderId"); }
}
private string orderRef;
[DisplayName("Reference")]
public string OrderRef {
get { return orderRef; }
set { SetField(ref orderRef, value, "OrderRef"); }
}
private decimal orderValue, carriageValue;
[DisplayName("Order Value")]
public decimal OrderValue {
get { return orderValue; }
set {
if (SetField(ref orderValue, value, "OrderValue")) {
OnPropertyChanged("TotalValue");
}
}
}
[DisplayName("Carriage Value")]
public decimal CarriageValue {
get { return carriageValue; }
set {
if (SetField(ref carriageValue, value, "CarriageValue")) {
OnPropertyChanged("TotalValue");
}
}
}
[DisplayName("Total Value")]
public decimal TotalValue { get { return OrderValue + CarriageValue; } }
}
[Serializable]
public class NotifyBase { // purely for convenience
[field: NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;
protected bool SetField<T>(ref T field, T value, string propertyName) {
if (!EqualityComparer<T>.Default.Equals(field, value)) {
field = value;
OnPropertyChanged(propertyName);
return true;
}
return false;
}
protected virtual void OnPropertyChanged(string propertyName) {
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
कोड के लिए धन्यवाद, ऐसा लगता है कि यह मेरे quesiton का जवाब है, मैं इस तरह के एक समाधान को लागू करने की कोशिश करेंगे और देखें कि मैं सफलता कर सकता हूं या नहीं। मैंने पोस्टशर्प देखा है, लेकिन मुझे पूरा यकीन नहीं है कि यह जाने का अच्छा तरीका है या नहीं। –
ट्री व्यू दर्द, नोट हैं –