[英]How to Toggle Visibility Between a Button and a Stack Panel Containing Two Buttons
我很難弄清楚如何在三個按鈕之間切換可見性。 這是場景:
Edit
按鈕,一個OK
按鈕和一個Cancel
按鈕。Ok
和Cancel
按鈕在堆棧面板中組合在一起。Edit
按鈕是獨立的。Edit
”按鈕時,它(“ Edit
”按鈕)被隱藏,並顯示包含“ Ok
”和“ Cancel
”按鈕的堆棧面板。Cancel
或Ok
按鈕時,它們將被隱藏,而Edit
按鈕將再次顯示。 這是表單上帶有“ Edit
”按鈕的行:
這是帶有Ok
和Cancel
按鈕的表單行:
這是我為這一行提出的 XAML 代碼:
<StackPanel
Orientation="Horizontal"
HorizontalAlignment="Center"
Grid.Row="2"
Grid.Column="0"
Grid.ColumnSpan="4">
<Label
Style="{StaticResource DeviceInfoPropertyLabelStyle}">
CONTROLLER NAME:
</Label>
<TextBox
Text="{Binding ControllerName}"
Style="{StaticResource DeviceInfoTextBoxStyle}" />
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel
Orientation="Horizontal"
Grid.Column="0">
<Button
Command="{Binding EditCommand}"
Visibility="{Binding IsEditButtonVisible, Converter={StaticResource BoolToVisibilityConverter}, FallbackValue=Collapsed}"
Style="{StaticResource DeviceInfoEditButtonStyle}">
Edit
</Button>
</StackPanel>
<StackPanel
x:Name="EditControllerNameStackPanel"
Orientation="Horizontal"
Grid.Column="0"
Visibility="{Binding IsOkCancelButtonVisible, Converter={StaticResource BoolToVisibilityConverter}, FallbackValue=Visible}">
<Button
Command="{Binding OkEditCommand}"
Style="{StaticResource DeviceInfoEditOkButtonStyle}">
OK
</Button>
<Button
Command="{Binding CancelEditCommand}"
Style="{StaticResource DeviceInfoEditCancelButtonStyle}">
CANCEL
</Button>
</StackPanel>
</Grid>
</StackPanel>
這是我目前擁有的 ViewModel 中的代碼。 在這一點上它只是一個骨架:
public bool IsEditButtonVisible
{
get
{
bool output = false;
if (true)
{
return true;
}
return output;
}
}
public bool IsOkCancelButtonVisible
{
get => true;
}
[RelayCommand]
private void Edit()
{
if (true)
{
}
}
[RelayCommand]
private void OkEdit()
{
}
[RelayCommand]
private void CancelEdit()
{
}
請注意,我使用的是 MVVM 社區工具包。
讓我知道是否需要提供任何其他信息。
謝謝
您可以只使用一個 boolean 來切換可見性。 稍微更改 BoolToVisibilityConverter 代碼..
public class BoolToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool b)
{
if (parameter is string str && str == "Inverse")
return b ? Visibility.Hidden : Visibility.Visible;
return b ? Visibility.Visible : Visibility.Hidden;
}
return Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
編輯按鈕
<Button
Visibility="{Binding IsEditButtonVisible, Converter={StaticResource BoolToVisibilityConverter}}">
確定/取消堆棧面板
<StackPanel
Visibility="{Binding IsEditButtonVisible, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter=Inverse}">
ViewModel(抱歉我不使用 MVVM Community Toolkit)
public class ViewModel : INotifyPropertyChanged
{
private bool _isEditButtonVisible;
public bool IsEditButtonVisible
{
set
{
_isEditButtonVisible = value;
OnPropertyChanged(nameof(IsEditButtonVisible));
}
get => _isEditButtonVisible;
}
private void Edit()
{
IsEditButtonVisible = false;
}
private void Ok()
{
IsEditButtonVisible = true;
}
private void Cancel()
{
IsEditButtonVisible = true;
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
// other code
}
要對其他 7 個類似的組應用相同的邏輯,您必須至少有 7 個布爾值,但您只能有 3 個命令,您可以在其中將組的名稱傳遞給命令,該命令將根據相應的組切換在傳遞的參數上
在視圖中
<Button
Command="{Binding OkCommand}"
CommandParameter="group1">
OK
</Button>
在視圖模型中
private void Edit(string commandParameter)
{
IsEdit1ButtonVisible = commandParameter != "group1";
IsEdit2ButtonVisible = commandParameter != "group2";
IsEdit3ButtonVisible = commandParameter != "group3";
// etc...
}
private void Ok(string commandParameter)
{
IsEdit1ButtonVisible = commandParameter == "group1";
IsEdit2ButtonVisible = commandParameter == "group2";
IsEdit3ButtonVisible = commandParameter == "group3";
// etc...
}
private void Cancel(string commandParameter)
{
IsEdit1ButtonVisible = commandParameter == "group1";
IsEdit2ButtonVisible = commandParameter == "group2";
IsEdit3ButtonVisible = commandParameter == "group3";
// etc...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.