2011-04-22 140 views
9

快速的問題...在Button.Click上更改ListBox.ItemsSource綁定屬性?

我有它的ItemsSource屬性ListBox綁定到一個集合屬性在視圖模型像這樣:

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

我也有同樣的視圖中的兩個Button對象。問題是......我可以使用XAML將CollectionsListBoxItemsSource BindingActivity.Timesheets更改爲Activity.Attachments嗎?

失敗,從使用Command對象的視圖模型?

編輯>>>

我發現了一個簡單的解決方案通過使用RadioButton!而非Button期從霍華德的部分答案:

<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> 

的幫助非常感謝。

回答

8

我不確定Button是否可以做到這一點。但單選按鈕只能在XAML中滿足你。

比方說,我們有兩個枚舉:

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

我在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> 

然後在這裏我們去:

<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

因爲我綁定到視圖模型,我就能夠讓你的實例的簡化版本。非常感謝。 – Sheridan 2011-04-22 19:52:00

+0

不客氣。我只是覺得觸發器有很多限制。也許我們可以有另一個問題在談論這個問題。 – Howard 2011-04-23 02:24:33

2

令我驚訝的以下似乎工作:

<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> 

編輯:如果這項工作顯然取決於itemssource的性質。動畫在這方面有點混亂。使用恆定狀態更好,例如正如Radibuttons所建議的那樣,Setters可以被使用。

+0

謝謝。就像你所說的那樣,我最終用了RadioButton。 – Sheridan 2011-04-22 19:53:10

3

儘可能多我明白這是你所需要的 -
ListBox with Dynamic ItemSource

這是我如何做
1)代碼的背後(有兩個枚舉)

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> 

點擊切換項目源按鈕將切換項目來源

+0

感謝您的時間,但我找到了一個更簡單的答案。 – Sheridan 2011-04-25 11:04:01

+0

好吧! NP:P – Rohit 2011-04-25 11:05:16

+0

我覺得有必要給你一個贊成花費的努力。至少它幫助了我。 – Mizipzor 2011-11-24 15:35:06