1

クラス インスタンスと 2 つの 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」をクリックすると状態が変化します。これは非常に単純な試みであり、どこに問題があるのか​​ わかりません。誰?

4

2 に答える 2

2

bde answerに加えて、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);

このようにして、プロパティの名前を文字列として渡さないようにします。

于 2012-11-22T13:42:09.843 に答える
2

バインディングを作成するとSource、オブジェクト自体ではなく、オブジェクトのプロパティに設定されます。コンストラクターでプロパティ名を指定しBinding、ソースをオブジェクトに設定する必要があります。

    b1 = new Binding("DeviceConfigured");
    b2 = new Binding("ProcessingData");
    b1.Source = myADS;
    b2.Source = myADS;
于 2012-11-21T20:42:50.673 に答える