2011-04-22 15 views
9
...

Cambiar la propiedad ListBox.ItemsSource Binding en Button.Click? Una pregunta rápida

tengo un ListBox con su propiedad ItemsSource ligado a una propiedad de colección en un modelo de vista de este modo:

<ListBox Name="CollectionsListBox" ItemsSource="{Binding Activity.Timesheets}" /> 

También tengo dos Button objetos en el mismo punto de vista. La pregunta es ... ¿Puedo cambiar el CollectionsListBoxItemsSource Binding de Activity.Timesheets a Activity.Attachments usando solo XAML?

En su defecto, desde el modelo de vista que utiliza objetos de Comando?

EDITAR >>>

he encontrado una solución sencilla mediante el uso de RadioButton s en lugar de Button s de una parte de la respuesta de Howard:

<ListBox Name="CollectionsListBox"> 
    <ListBox.Style> 
     <Style> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=TimesheetsButton,Path=IsChecked}" Value="True"> 
        <Setter Property="ListBox.ItemsSource" Value="{Binding Activity.Timesheets}" /> 
        <Setter Property="ListBox.ItemContainerStyle" Value="{StaticResource TimesheetStyle}" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding ElementName=AttachmentsButton,Path=IsChecked}" Value="True"> 
        <Setter Property="ListBox.ItemsSource" Value="{Binding Activity.Attachments}" /> 
        <Setter Property="ListBox.ItemContainerStyle" Value="{StaticResource AttachmentStyle}" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ListBox.Style> 
</ListBox> 

Muchas gracias por la ayuda.

Respuesta

8

No estoy seguro si Button puede hacer esto. Pero radiobutton solo puede satisfacerlo en XAML.

Digamos que tenemos dos enumeración:

public enum E { A = 0, B = 1, C = 2 } 
public enum F { G = 0, H = 1, L = 2 } 

que los definió como recurso en el XAML:

<ObjectDataProvider ObjectType="{x:Type sys:Enum}" MethodName="GetValues" x:Key="EProvider"> 
    <ObjectDataProvider.MethodParameters> 
     <x:TypeExtension Type="{x:Type local:E}" /> 
    </ObjectDataProvider.MethodParameters> 
</ObjectDataProvider> 

<ObjectDataProvider ObjectType="{x:Type sys:Enum}" MethodName="GetValues" x:Key="FProvider"> 
    <ObjectDataProvider.MethodParameters> 
     <x:TypeExtension Type="{x:Type local:F}" /> 
    </ObjectDataProvider.MethodParameters> 
</ObjectDataProvider> 

Entonces aquí vamos:

<ListBox x:Name="List1"> 
    <ListBox.Style> 
     <Style> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding ElementName=Rdb1,Path=IsChecked}" Value="True"/> 
        </MultiDataTrigger.Conditions> 
        <Setter Property="ListBox.ItemsSource" Value="{Binding Source={StaticResource EProvider}}" /> 
       </MultiDataTrigger> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding ElementName=Rdb2,Path=IsChecked}" Value="True"/> 
        </MultiDataTrigger.Conditions> 
        <Setter Property="ListBox.ItemsSource" Value="{Binding Source={StaticResource FProvider}}" /> 
       </MultiDataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ListBox.Style> 
</ListBox> 
<RadioButton x:Name="Rdb1" GroupName="Group1" /> 
<RadioButton x:Name="Rdb2" GroupName="Group1" /> 
+0

Como estoy unión a un modelo de vista, yo era capaz de hacer una versión simplificada de su ejemplo. Muchas gracias. – Sheridan

+0

De nada.Solo creo que hay tantos límites en el gatillo. Tal vez podamos tener otra pregunta hablando de esto. – Howard

2

Para mi sorpresa el El siguiente parece funcionar:

<ListBox Name="myLB" ItemsSource="{Binding Data}"/> 
<Button Content="This is a Button"> 
    <Button.Triggers> 
     <EventTrigger RoutedEvent="Button.Click"> 
      <BeginStoryboard> 
       <Storyboard> 
        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="myLB" 
                Storyboard.TargetProperty="ItemsSource"> 
         <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{Binding Data2}"/> 
        </ObjectAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Button.Triggers> 
</Button> 

Editar: Si esto funciona aparentemente depende de la naturaleza del elemento. Las animaciones son un poco desordenadas en ese sentido. Usar estados constantes es mejor, p. como se sugiere con Radiobuttons desde entonces se pueden usar Setters.

+0

Gracias. Fui con 'RadioButton's al final como sugirió. – Sheridan

3

Por mucho que entender que esto es lo que necesita -
ListBox with Dynamic ItemSource

Aquí es cómo lo hice
1) Código Atrás (con dos enumeraciones)

public enum Enum1{R = 0, O = 1,H = 2,I = 3,T = 4} 
public enum Enum2{A = 0,S = 1, I = 2,T = 3} 
public partial class Window1 : Window, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private bool toggleItemSource; 
    public bool ToggleItemSource 
    { 
     get 
     { 
      return this.toggleItemSource; 
     } 
     set 
     { 
      this.toggleItemSource = value; 
      this.PropertyChanged(this, new PropertyChangedEventArgs("ToggleItemSource")); 
     } 
    } 

    public Window1() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     this.ToggleItemSource = this.ToggleItemSource ? false : true; 
    } 
} 

XAML

<Window x:Class="Listbox_with_dynamic_data_source.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:sys="clr-namespace:System;assembly=mscorlib" 
xmlns:local="clr-namespace:Listbox_with_dynamic_data_source" 
Title="Window1" Height="300" Width="300"> 

<ObjectDataProvider ObjectType="{x:Type sys:Enum}" 
         MethodName="GetValues" 
         x:Key="Enum2Provider"> 
     <ObjectDataProvider.MethodParameters> 
      <x:TypeExtension Type="{x:Type local:Enum2}" /> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
</Window.Resources> 
<Grid> 
    <!-- ListBox--> 
    <ListBox x:Name="DynamicListBox" 
      Padding="10" HorizontalAlignment="Left" Width="52" Margin="20,21,0,115"> 
     <ListBox.Style> 
      <Style TargetType="{x:Type ListBox}"> 
       <Setter Property="ItemsSource" 
         Value="{Binding Source={StaticResource Enum1Provider}}"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=ToggleItemSource, 
                UpdateSourceTrigger=PropertyChanged 
              }" 
           Value="False"> 
         <Setter Property="ItemsSource" 
           Value="{Binding Source={StaticResource Enum2Provider}}"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ListBox.Style> 
    </ListBox> 
    <!-- Toggle Button --> 
    <Button Height="29" 
      Margin="94,45.44,59,0" 
      Name="button1" 
      VerticalAlignment="Top" 
      Click="button1_Click" 
      Content="ToggleItemSource" /> 
</Grid> 

Al hacer clic en el botón Cambiar Artículo Fuente conmutará la Fuente Artículos

+0

Gracias por su tiempo, pero encontré una respuesta más simple. – Sheridan

+0

¡Muy bien! NP: P – Rohit

+0

Sentí la necesidad de darle un voto positivo solo por el esfuerzo realizado. Al menos me ayudó. – Mizipzor

Cuestiones relacionadas