Veritabanları uzantısı kullanarak güçlü yazılan Windows Forms veri bağlama arıyorum.Güçlü yazılan Windows Formları
txtBoundInt.DataBindings.Add<Contact>
(bindingSource, tb => tb.Text, contact => contact.Id);
Ya da bu:
cboBoundSelectedItem.DataBindings.Add
<Contact, ComboBox>
(bindingSource, cbo => cbo.SelectedItem, con => con.ContactType)
gibi görünüyor Şimdi bir böyle DataBinding kurabilirsiniz
using System;
using System.Linq.Expressions;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public static Binding Add<T>
(this ControlBindingsCollection dataBindings,
object dataSource,
Expression<Func<Control, object>> controlExpression,
Expression<Func<T, object>> objectExpression)
{
return Add(dataBindings, dataSource, controlExpression, objectExpression, false);
}
public static Binding Add<T>
(this ControlBindingsCollection dataBindings,
object dataSource,
Expression<Func<Control, object>> controlExpression,
Expression<Func<T, object>> objectExpression,
bool formattingEnabled)
{
string controlPropertyName = ProcessExpression(controlExpression.Body);
string bindingTargetName = ProcessExpression(objectExpression.Body);
return dataBindings
.Add(controlPropertyName, dataSource, bindingTargetName, formattingEnabled);
}
public static Binding Add<T, K>
(this ControlBindingsCollection dataBindings,
object dataSource,
Expression<Func<K, object>> controlExpression,
Expression<Func<T, object>> objectExpression)
{
return Add(dataBindings, dataSource, controlExpression, objectExpression, false);
}
public static Binding Add<T, K>
(this ControlBindingsCollection dataBindings,
object dataSource,
Expression<Func<K, object>> controlExpression,
Expression<Func<T, object>> objectExpression,
bool formattingEnabled
)
{
string controlPropertyName = ProcessExpression(controlExpression.Body);
string bindingTargetName = ProcessExpression(objectExpression.Body);
return dataBindings.Add(controlPropertyName, dataSource, bindingTargetName, formattingEnabled);
}
private static string ProcessExpression(Expression expression)
{
string propertyName;
if (expression is MemberExpression)
{
propertyName = ((MemberExpression) (expression)).Member.Name;
}
else if (expression is UnaryExpression)
{
propertyName = ((MemberExpression) ((UnaryExpression) (expression)).Operand).Member.Name;
}
else
{
throw new InvalidOperationException(
"Unknown expression type error in DataBindingsExtensionMethods.Add<T, K>");
}
return propertyName;
}
}
: Ben aşağıdaki gibi Xavier bu kadar aşağıdaki yardım var Gerçi bir sürü ifade dökümü devam ediyor. Daha iyi bir yolu var mı?
Düzenleme: Daha iyi bir yol buldunuz ama bunun cevabı bu soruyu değiştirmek için başı derde girdi - bu @Carl_G tarafından reproduced below bu.
Lütfen sorunuzun cevabını değiştirmeyin. Bir çözüm bulduysanız, cevaplar bölümüne gitmesi gerekir. Bir çözüm için google bağlantılarına hızla göz atmaya çalışan bir kişiye, sorunun ne olduğunu bilmeden "Tamam, bir çözüm buldum" ya da ziyaretçinin sorununa uygulanabilir olup olmadığını değerlendirmek çok şaşırıyor. –
Ah, kurallara göre oynamalıyız .. – stuartd
C# 6'daki yeni nameof() işlevinin de bir dizgeyi kullanmaktan kaçınmak için kullanılabileceği belirtilmelidir. https://msdn.microsoft.com/en-us/library/dn986596.aspx –