[英]Data binding in code-behind
我想在一個類實例和兩個WPF文本框之間設置一個綁定。 不過,文本框不會更改其狀態,我無法弄清楚自己在做什么錯。
XAML
<DockPanel>
<TextBlock Style="{StaticResource caption}">Testing System</TextBlock>
<TextBlock DockPanel.Dock="Left" x:Name="txt1" Text="DC"/>
<TextBlock DockPanel.Dock="Right" x:Name="txt2" Text="PD"/>
<Button Height="20" Width="100" Click="clickBinding">Bind</Button>
<Button Height="20" Width="100" Click="clickChangeBinding">Change Status</Button>
</DockPanel>
MainWindow.xaml.cs
private ADSbinding myADS = new ADSbinding();
private void clickBinding(object sender, RoutedEventArgs e)
{
Binding b1, b2;
b1 = new Binding();
b2 = new Binding();
b1.Source = myADS.DeviceConfigured;
b2.Source = myADS.ProcessingData;
b1.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
b2.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(txt1, TextBlock.TextProperty, b1);
BindingOperations.SetBinding(txt2, TextBlock.TextProperty, b2);
}
private void clickChangeBinding(object sender, RoutedEventArgs e)
{
myADS.changedata();
}
類:
public class ADSbinding : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string deviceConfigured = "false";
private string processingData = "false";
public ADSbinding()
{
ProcessingData = "true";
}
// Get-Set methods
public string DeviceConfigured
{
get { return deviceConfigured; }
set
{
deviceConfigured = value;
Changed("DeviceConfigured");
}
}
public string ProcessingData
{
get { return processingData; }
set
{
processingData = value;
Changed("ProcessingData");
}
}
private void Changed(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public void changedata()
{
DeviceConfigured = "change";
ProcessingData = "change";
}
}
當按下“ clickBinding”時,狀態會更改;當“ clickChangeBinding”時,狀態會保留;通過再次單擊“ clickBinding”,它會更改。 這是非常直接的嘗試,我無法弄清楚問題出在哪里。 任何人?
創建綁定時,將Source
設置為對象的屬性,而不是對象本身的屬性。 您應該在Binding
構造函數中指定屬性名稱,然后將源設置為您的對象:
b1 = new Binding("DeviceConfigured");
b2 = new Binding("ProcessingData");
b1.Source = myADS;
b2.Source = myADS;
除了bde答案,您還可以使用擴展方法,該方法允許您直接在FrameworkElement上設置綁定
public static void SetBinding(this FrameworkElement target, DependencyProperty property, TargetType source, Expression<Func<TargetType, PropertyType>> property_accessor)
{
var binding = new Binding(source.PropertyName(property_accessor));
binding.Source = source;
target.SetBinding(property, binding);
}
public static string PropertyName(this TargetType obj, Expression<Func> property_accessor)
{
return ((MemberExpression)property_accessor.Body).Member.Name;
}
不用打字
BindingOperations.SetBinding(txt1, TextBlock.TextProperty, b1);
BindingOperations.SetBinding(txt2, TextBlock.TextProperty, b2);
您可以使用上面定義的擴展方法SetBinding
txt1.SetBinding(TextBlock.TextProperty, myADS, x => x.DeviceConfigured);
txt2.SetBinding(TextBlock.TextProperty, myADS, x => x.ProcessingData);
這樣,您可以避免將屬性名稱作為字符串傳遞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.