2016-12-19 19 views
1

В моем WPF приложении, у меня есть кнопка Сохранить, которая должна быть включена, когда счетчик коллекции больше 0.WPF: Преобразование целого числа в BOOL с помощью ObjectDataProvider

Я пытаюсь преобразовать с помощью ObjectDataProvider, который будет использовать Convert.ToBoolean(int value) , (Я могу использовать конвертер, но почему бы не попробовать узнать что-то другое сегодня.)

Итак, я сделал это, как показано ниже, но это не работает.

<ObjectDataProvider x:Key="Convert" 
        ObjectType="{x:Type sys:Convert}" 
        MethodName="ToBoolean"> 
    <ObjectDataProvider.MethodParameters> 
     <sys:Int32>0</sys:Int32> 
    </ObjectDataProvider.MethodParameters> 
</ObjectDataProvider> 

<Button IsEnabled="{Binding MyCollection.Count, Source={StaticResource Convert}}"> 

Что мне не хватает?

+0

Каков фактический тип 'MyCollection'? (Надеюсь, вы знаете о «ICommand»). – Dennis

+0

@ Dennis: 'MyCollection'' 'ObservableCollection'. –

+0

А, я вижу. Вы хотите передать 'MyCollection.Count' в' Convert.ToBoolean' в качестве аргумента. Боюсь, это невозможно (хотя я не совсем уверен). IMO, конвертер/'ICommand' - это путь сюда. Обратите внимание, что этот образец из опубликованной вами ссылки использует трюк - он связывает параметр метода с другим элементом управления, который может изменить его значение. – Dennis

ответ

1

Основываясь на ссылке, предоставленной Prjaval, и вы, я пишу это как ответ.

<Button IsEnabled="{Binding MyCollection.Count, Source={StaticResource Convert}}"> 

В коде, вы обращаетесь, MyCollection.Count от объекта Boolean, поэтому он будет давать обязательные ошибки и не будет работать.

мы можем достичь вашего требования, обновив параметр метода ObjectDataProvider через другой источник и используем источник в разных привязках. Это означает, что мы не можем назначить методпараметр и использовать Source в том же переплетении.

я пытался так и работал отлично,

<Grid> 
       <Grid.Resources> 
       <ObjectDataProvider x:Key="convert" 
            MethodName="ToBoolean" 
            ObjectType="{x:Type sys:Convert}"> 
        <ObjectDataProvider.MethodParameters> 
         <sys:Int32>0</sys:Int32> 
        </ObjectDataProvider.MethodParameters> 
       </ObjectDataProvider> 
      </Grid.Resources> 
      <Grid.RowDefinitions> 
       <RowDefinition/> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 
      <!--Updating Parameter--> 
      <ItemsControl ItemsSource="{Binding Groups}"> 
       <i:Interaction.Behaviors> 
        <local:ObjectDataUpdate> 
         <local:ObjectDataUpdate.Count> 
          <Binding BindsDirectlyToSource="True" 
             Mode="OneWayToSource" 
             Path="MethodParameters[0]" 
             Source="{StaticResource convert}" /> 
         </local:ObjectDataUpdate.Count> 
        </local:ObjectDataUpdate> 
       </i:Interaction.Behaviors> 
      </ItemsControl> 
      <!--Using ObjectDataProvider--> 
      <Button Height="40" Grid.Row="1" IsEnabled="{Binding Source={StaticResource convert}}" /> 
     </Grid> 

Поведение

public class ObjectDataUpdate : Behavior<ItemsControl> 
    { 
     protected override void OnAttached() 
     { 
      base.OnAttached(); 
      AssociatedObject.Loaded += (_, __) => 
      { 
       //Some logics to update Count. I'm setting directly for sample purpose 
       Count = AssociatedObject.Items.Count; 
      }; 
     } 

     public int Count 
     { 
      get { return (int)GetValue(CountProperty); } 
      set { SetValue(CountProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for Count. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty CountProperty = 
      DependencyProperty.Register("Count", typeof(int), typeof(ObjectDataUpdate), new PropertyMetadata(0)); 

    } 

я использовал отдельное поведение для обновления параметров.

, пожалуйста, исправьте меня, если что-то не так.

+0

следует также отследить, чтобы отменить обработчик события из события «AssociatedObject.Loaded» в методе «OnDetaching» –

0

Я проверил ObjectDataProvider и до сих пор получил это.

Он динамически создает объект для привязки.

Итак, проблема здесь.

"{Binding MyCollection.Count, Source={StaticResource Convert}}" 

Вы должны связать только источник и MyCollection.Count должен быть получен в Convert.

Ознакомьтесь с этим учебным пособием от DevCurry.

+0

Вы можете передавать методы и выполнять привязку, как указано здесь. Http://www.shujaat.net/2011/02/wpf-binding-method-parameters-of.html –

+0

Вы пробовали использовать 'path =' также, какая ошибка? вы получаете? – Prajwal