2015-05-06 30 views
0

我遇到过这种情况,我需要根据选择哪个切换按钮来动态设置组合框的Items源。如何根据bool值动态设置ComboBox绑定?

在应用程序中有两个切换按钮,高/普通。如果高位切换,我想将组合框的绑定设置为higherGradePointKV,否则如果普通切换为ordinaryGradePointKV

到目前为止,我设置了Bool属性,用于更高/普通以及在视图模型的构造函数中调用的。

我正在努力的部分是在此方法中设置来自代码的绑定。

有谁知道我可以如何设置这个实现的其余部分?

这就是布尔属性和列表被定义并称为视图模型:

namespace LC_Points.ViewModel 
{ 

    public class MainViewModel : ViewModelBase 
    { 

     /// <summary> 
     /// Initializes a new instance of the MainViewModel class. 
     /// </summary> 
     public MainViewModel() 
     { 
      //call methods to initilise list data 
      SetGradeComboBoxBinding(); 
      GetOrdinaryGradePairs(); 
      GetHigherGradePairs(); 
     } 

     public List<StringKeyValue> higherGradePointKV { get; set; } 
     public List<StringKeyValue> ordinaryGradePointKV { get; set; } 


     //ordinary toggle button bool 
     private bool _isOrdinaryToggled; 
     public bool IsOrdinaryToggled 
     { 
      get 
      { 
       return _isOrdinaryToggled; 
      } 
      set 
      { 
       _isOrdinaryToggled = value; 
       RaisePropertyChanged("IsOrdinaryToggled"); 
      } 
     } 

     //Higher toggle button bool property 
     private bool _isHigherToggled; 
     public bool IsHigherToggled 
     { 
      get 
      { 
       return _isHigherToggled; 
      } 
      set 
      { 
       _isHigherToggled = value; 
       RaisePropertyChanged("IsHigherToggled"); 
      } 
     } 


     //Sets the grade combo box binding based on button toggled. 
     public void SetGradeComboBoxBinding() 
     { 

      if(_isHigherToggled) 
      { 
       //set binding to higherGradePointKV 

      } 
      else if(_isOrdinaryToggled) 
      { 

       //set binding to higherGradePointKV 


      } 

     } 


     public class StringKeyValue 
     { 
      public string Key { get; set; } 
      public int Value { get; set; } 
     } 


     public void GetOrdinaryGradePairs() 
     { 

      List<StringKeyValue> ordianryGradePointKVTemp = new List<StringKeyValue>(); 


      ordianryGradePointKVTemp.Add(new StringKeyValue { Key = "A1", Value = 60 }); 
      ordianryGradePointKVTemp.Add(new StringKeyValue { Key = "A2", Value = 50 }); 
      ordianryGradePointKVTemp.Add(new StringKeyValue { Key = "B1", Value = 45 }); 
      ordianryGradePointKVTemp.Add(new StringKeyValue { Key = "B2", Value = 40 }); 
      ordianryGradePointKVTemp.Add(new StringKeyValue { Key = "B3", Value = 35 }); 
      ordianryGradePointKVTemp.Add(new StringKeyValue { Key = "C1", Value = 30 }); 
      ordianryGradePointKVTemp.Add(new StringKeyValue { Key = "C2", Value = 25 }); 
      ordianryGradePointKVTemp.Add(new StringKeyValue { Key = "C3", Value = 20 }); 
      ordianryGradePointKVTemp.Add(new StringKeyValue { Key = "D1", Value = 15 }); 
      ordianryGradePointKVTemp.Add(new StringKeyValue { Key = "D2", Value = 10 }); 
      ordianryGradePointKVTemp.Add(new StringKeyValue { Key = "D3", Value = 5 }); 
      ordianryGradePointKVTemp.Add(new StringKeyValue { Key = "E,F,NG", Value = 0 }); 
      ordianryGradePointKVTemp.Add(new StringKeyValue { Key = "Pass", Value = 30 }); 
      ordianryGradePointKVTemp.Add(new StringKeyValue { Key = "Merit", Value = 50 }); 
      ordianryGradePointKVTemp.Add(new StringKeyValue { Key = "Distinction", Value = 70 }); 


      ordinaryGradePointKV = ordianryGradePointKVTemp; 

     } 


     public void GetHigherGradePairs() 
     { 

      List<StringKeyValue> higherGradePointKVTemp = new List<StringKeyValue>(); 


      higherGradePointKVTemp.Add(new StringKeyValue { Key = "A1", Value = 100 }); 
      higherGradePointKVTemp.Add(new StringKeyValue { Key = "A2", Value = 90 }); 
      higherGradePointKVTemp.Add(new StringKeyValue { Key = "B1", Value = 85 }); 
      higherGradePointKVTemp.Add(new StringKeyValue { Key = "B2", Value = 80 }); 
      higherGradePointKVTemp.Add(new StringKeyValue { Key = "B3", Value = 75 }); 
      higherGradePointKVTemp.Add(new StringKeyValue { Key = "C1", Value = 70 }); 
      higherGradePointKVTemp.Add(new StringKeyValue { Key = "C2", Value = 65 }); 
      higherGradePointKVTemp.Add(new StringKeyValue { Key = "C3", Value = 60 }); 
      higherGradePointKVTemp.Add(new StringKeyValue { Key = "D1", Value = 55 }); 
      higherGradePointKVTemp.Add(new StringKeyValue { Key = "D2", Value = 50 }); 
      higherGradePointKVTemp.Add(new StringKeyValue { Key = "D3", Value = 45 }); 
      higherGradePointKVTemp.Add(new StringKeyValue { Key = "E,F,NG", Value = 0 }); 
      higherGradePointKVTemp.Add(new StringKeyValue { Key = "Pass", Value = 30 }); 
      higherGradePointKVTemp.Add(new StringKeyValue { Key = "Merit", Value = 50 }); 
      higherGradePointKVTemp.Add(new StringKeyValue { Key = "Distinction", Value = 70 }); 


      higherGradePointKV = higherGradePointKVTemp; 
     } 


    } 
} 

这是目前在那里经由XAML指定只有一个物品来源视图:

<Page x:Class="LC_Points.MainPage" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="using:LC_Points" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" 
     DataContext="{Binding Source={StaticResource Locator}}" 
     mc:Ignorable="d"> 



    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="40*" /> 
      <RowDefinition Height="20*" /> 
      <RowDefinition Height="30*" /> 
      <RowDefinition Height="30*" /> 
      <RowDefinition Height="20*" /> 
      <RowDefinition Height="20*" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="4*" /> 
      <ColumnDefinition Width="3*" /> 
      <ColumnDefinition Width="2*" /> 
     </Grid.ColumnDefinitions> 

     <!-- TitlePanel contains the name of the application and page title --> 
     <StackPanel x:Name="TitlePanel" 
        Grid.Row="0" 
        Margin="12,17,0,28"> 
      <TextBlock Style="{StaticResource SubheaderTextBlockStyle}" Text="LC POINTS" /> 
      <TextBlock Margin="9,-7,0,0" 
         Foreground="DarkGreen" 
         Style="{StaticResource HeaderTextBlockStyle}" 
         Text="Home" /> 
     </StackPanel> 

     <ComboBox x:Name="gradeCmbBx" 
        Grid.Row="1" 
        Grid.Column="0" 
        Grid.ColumnSpan="2" 
        Width="60" 
        HorizontalAlignment="Right" 
        DisplayMemberPath="Key" 
        ItemsSource="{Binding ordinaryGradePointKV}" /> 


     <ToggleButton x:Name="higherTglBtn" 
         Grid.Row="3" 
         HorizontalAlignment="Left" 
         Content="Higher" 
         IsChecked="{Binding IsHigherToggled, 
              Mode=TwoWay}" /> 
     <ToggleButton x:Name="ordinaryTglBtn" 
         Grid.Row="3" 
         Grid.ColumnSpan="2" 
         HorizontalAlignment="Center" 
         Content="Ordinary" 
         IsChecked="{Binding IsOrdinaryToggled, 
              Mode=TwoWay}" /> 

    </Grid> 


</Page> 

回答

1

在组合框的自定义样式上使用Triggers属性来更改源。

<ComboBox 
    Grid.Row="1" 
    Grid.Column="0" 
    Grid.ColumnSpan="2" 
    Width="60" 
    HorizontalAlignment="Right" 
    DisplayMemberPath="Key"> 
    <ComboBox.Style> 
     <Style> 
      <Setter Property="ComboBox.ItemsSource" Value="{Binding ordinaryGradePointKV}"></Setter> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsHigherToggled}" Value="True"> 
        <Setter Property="ComboBox.ItemsSource" 
         Value="{Binding higherGradePointKV}" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ComboBox.Style> 
</ComboBox> 
+0

好的,在这种情况下,我需要设置'higherGradePointKV',如果'IsOrdinaryToggled',我是否需要设置第二个样式?你能否显示实现请 –

+0

在这种情况下,只交换ItemsSource绑定,第一个是默认值,当IsHigherToggled为true时,触发器将覆盖它。 – Cyral

+0

对,我看到你在那里做什么,应该工作完美,我会稍后测试并报告结果。 –

相关问题