我有一个统一的网格,我想动态显示内容/视图。它可以显示1、2、4或6个内容。我设置了统一网格行,col绑定和内容可见性绑定。对于视图/内容,这不起作用,但确实适用于矩形。这是为什么?我如何修改它以使用视图/内容。示例MainWindow.xaml代码.....
<StackPanel>
<ComboBox HorizontalAlignment="Left" Width="50" SelectedIndex="{Binding SelectedIndex}">
<ComboBoxItem IsSelected="True" Content="1" />
<ComboBoxItem Content="2" />
<ComboBoxItem Content="4" />
<ComboBoxItem Content="6" />
</ComboBox>
<!-- NOT CORRECT, SHOWS 6 ITEMS ALWAYS -->
<UniformGrid Rows="{Binding ScreenRows}" Columns="{Binding ScreenCols}">
<local:ScreenView Grid.Row="0" Grid.Column="0" Visibility="{Binding VisibleScreen[0]}" />
<local:ScreenView Grid.Row="0" Grid.Column="1" Visibility="{Binding VisibleScreen[1]}" />
<local:ScreenView Grid.Row="0" Grid.Column="2" Visibility="{Binding VisibleScreen[2]}" />
<local:ScreenView Grid.Row="1" Grid.Column="0" Visibility="{Binding VisibleScreen[3]}" />
<local:ScreenView Grid.Row="1" Grid.Column="1" Visibility="{Binding VisibleScreen[4]}" />
<local:ScreenView Grid.Row="1" Grid.Column="2" Visibility="{Binding VisibleScreen[5]}" />
</UniformGrid>
<!-- OK, SHOWS 1,2,4, or 6 RECT DEPENDING ON SelectedIndex -->
<UniformGrid Rows="{Binding ScreenRows}" Columns="{Binding ScreenCols}">
<Rectangle Width="20" Height="20" Grid.Row="0" Grid.Column="0" Fill="Red" Visibility="{Binding VisibleScreen[0]}" />
<Rectangle Width="20" Height="20" Grid.Row="0" Grid.Column="1" Fill="Orange" Visibility="{Binding VisibleScreen[1]}" />
<Rectangle Width="20" Height="20" Grid.Row="0" Grid.Column="2" Fill="Yellow" Visibility="{Binding VisibleScreen[2]}" />
<Rectangle Width="20" Height="20" Grid.Row="1" Grid.Column="0" Fill="Green" Visibility="{Binding VisibleScreen[3]}" />
<Rectangle Width="20" Height="20" Grid.Row="1" Grid.Column="1" Fill="Blue" Visibility="{Binding VisibleScreen[4]}" />
<Rectangle Width="20" Height="20" Grid.Row="1" Grid.Column="2" Fill="Violet" Visibility="{Binding VisibleScreen[5]}" />
</UniformGrid>
</StackPanel>
基本上,我有一个组合框。如果选择1,我的ViewModel将动态更改rows = 1,cols = 1,并显示第一个内容为Visible,其他的则折叠。它适用于矩形,但不适用于矩形。这是为什么?如何修复它以便使其适用于视图?
所有人都很好奇,这是MainWindowViewModel中的代码(原始MVVM)>
class MainWindowViewModel : BindableBase { private const int SCREEN_MAX = 6; private int screenRows = 1; public int ScreenRows { get { return screenRows; } set { SetProperty(ref screenRows, value); } } private int screenCols = 1; public int ScreenCols { get { return screenCols; } set { SetProperty(ref screenCols, value); } } private Visibility[] visibleScreen = new Visibility[SCREEN_MAX]; public Visibility[] VisibleScreen { get { return visibleScreen; } set { SetProperty(ref visibleScreen, value); } } private int selectedIndex; public int SelectedIndex { get { return selectedIndex; } set { SetProperty(ref selectedIndex, value); ChangeScreen(selectedIndex); } } private void ShowScreens(int num_screens) { // make all collapse for (int i = 0; i < SCREEN_MAX; i++) VisibleScreen[i] = Visibility.Collapsed; // show only X num screens for (int i = 0; i < num_screens; i++) VisibleScreen[i] = Visibility.Visible; RaisePropertyChanged("VisibleScreen"); } public void ChangeScreen(int idx) { switch (idx) { case 0: ScreenRows = 1; ScreenCols = 1; ShowScreens(1); break; case 1: ScreenRows = 1; ScreenCols = 2; ShowScreens(2); break; case 2: ScreenRows = 2; ScreenCols = 2; ShowScreens(4); break; case 3: ScreenRows = 2; ScreenCols = 3; ShowScreens(6); break; } } }
The ScreenView.xaml
<UserControl...> <!-- SOME HOW IT IS THIS DATACONTEXT CODE MESS UP THE UI --> <UserControl.DataContext> <local:ScreenViewModel x:Name="vm"/> </UserControl.DataContext> <StackPanel> <TextBlock>TEST</TextBlock> </StackPanel> </UserControl>
样本输出
您可以从示例输出中看到,我的组合选择为1,因此它应该显示1 TEST,而显示1正方形是正确的。但是为什么要显示6个测试?如何显示1个TEST?
这是一个corect输出
谢谢!
我有一个统一的网格,我想动态显示内容/视图。它可以显示1、2、4或6个内容。我设置了统一网格行,col绑定和内容可见性绑定。这不是...
selectedIndex
的初始值为0(int字段的默认值)。但是VisibleScreen数组的内容与selectedIndex不匹配-您需要在初始化期间调用ChangeScreen,例如像这样: