[c#] ViewModel의 bool 값에 Button의 가시성 바인딩

내 ViewModel의 bool 값에 단추의 가시성을 어떻게 바인딩합니까?

<Button Height="50" Width="50" Style="{StaticResource MyButtonStyle}"
    Command="{Binding SmallDisp}" CommandParameter="{Binding}" Cursor="Hand"
    Visibility="{Binding Path=AdvancedFormat}" />



답변

가정 AdvancedFormatA는 bool, 당신은 선언하고를 사용해야합니다 BooleanToVisibilityConverter:

<!-- In your resources section of the XAML -->
<BooleanToVisibilityConverter x:Key="BoolToVis" />

<!-- In your Button declaration -->
<Button
 Height="50" Width="50"
 Style="{StaticResource MyButtonStyle}"
 Command="{Binding SmallDisp}" CommandParameter="{Binding}"
Cursor="Hand" Visibility="{Binding Path=AdvancedFormat, Converter={StaticResource BoolToVis}}"/>

추가 된 Converter={StaticResource BoolToVis}.

이것은 MVVM으로 작업 할 때 매우 일반적인 패턴입니다. 이론적으로는 뷰 모델 속성에 직접 변환을 할 수있는 (즉, 단지 유형의 특성 자체를 만들어 Visibility내가 그렇게하지 선호하지만 이제부터) 되는 문제의 분리 덤비는. 항목의 가시성은 실제로보기에 달려 있어야합니다.


답변

변환기 나 뷰 모델 변경이 필요없는 세 번째 방법이 있습니다. 스타일을 사용하세요.

<Style TargetType="Button">
   <Setter Property="Visibility" Value="Collapsed"/>
   <Style.Triggers>
      <DataTrigger Binding="{Binding IsVisible}" Value="True">
         <Setter Property="Visibility" Value="Visible"/>
      </DataTrigger>
   </Style.Triggers>
</Style>

이 기술을 선호하는 경향이 있습니다. 바인딩 대상이 부울 이 아닌 많은 경우에 사용하기 때문입니다. 예를 들어 DataContextnull이 아닌 경우에만 요소를 표시 하거나 다른 레이아웃이 표시되는 다중 상태 디스플레이를 구현합니다. 뷰 모델에서 열거 형 설정.


답변

부울에서 가시성으로 C #의 양방향 변환

using System;
using System.Windows;
using System.Windows.Data;

namespace FaceTheWall.converters
{
    class BooleanToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is Boolean && (bool)value)
            {
                return Visibility.Visible;
            }
            return Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is Visibility && (Visibility)value == Visibility.Visible)
            {
                return true;
            }
            return false;
        }
    }
}


답변

일반적으로이를 수행하는 두 가지 방법이 있습니다. 변환기 클래스 또는 기본적으로 값을 변환하는 Viewmodel의 속성입니다.

일회성 전환 인 경우 속성 접근 방식을 사용하는 경향이 있습니다. 재사용하려면 변환기를 사용하십시오. 아래에서 변환기의 예를 찾으십시오.

<ValueConversion(GetType(Boolean), GetType(Visibility))> _
Public Class BoolToVisibilityConverter
    Implements IValueConverter

    Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert

        If value IsNot Nothing Then
            If value = True Then
                Return Visibility.Visible
            Else
                Return Visibility.Collapsed
            End If
        Else
            Return Visibility.Collapsed
        End If
    End Function

    Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Throw New NotImplementedException
    End Function
End Class

ViewModel 속성 메서드는 부울 속성 값을 확인하고이를 기반으로 가시성을 반환합니다. INotifyPropertyChanged를 구현하고 Boolean 및 Visibility 속성 모두에서 호출하여 올바르게 업데이트해야합니다.


답변

이것은 매우 간단한 방법으로 달성 될 수 있습니다. 1. 이것을 뷰에 씁니다.

<Button HorizontalAlignment="Center" VerticalAlignment="Center" Width="50" Height="30">
<Button.Style>
        <Style TargetType="Button">
                <Setter Property="Visibility" Value="Collapsed"/>
                        <Style.Triggers>
                                <DataTrigger Binding="{Binding IsHide}" Value="True">
                                        <Setter Property="Visibility" Value="Visible"/>
                                    </DataTrigger>
                            </Style.Triggers>
            </Style>
    </Button.Style>

  1. 다음은 참 / 거짓 값을 보유하는 부울 속성입니다. 다음은 코드 조각입니다. 내 예에서이 속성은 UserNote 클래스에 있습니다.

    public bool _isHide = false;
    
    public bool IsHide
    {
    
    get { return _isHide; }
    
    set
        {
            _isHide = value;
                OnPropertyChanged("IsHide");
        }
    } 
  2. 이것이 IsHide 속성이 값을 가져 오는 방법 입니다.

    userNote.IsHide = userNote.IsNoteDeleted;

답변

보기에서 :

<Button
 Height="50" Width="50"
 Style="{StaticResource MyButtonStyle}"
 Command="{Binding SmallDisp}" CommandParameter="{Binding}"
Cursor="Hand" Visibility="{Binding Path=AdvancedFormat}"/>

보기 모델에서 :

public _advancedFormat = Visibility.visible (whatever you start with)

public Visibility AdvancedFormat
{
 get{return _advancedFormat;}
 set{
   _advancedFormat = value;
   //raise property changed here
}

속성 변경 이벤트가 필요합니다.

 protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChanged.Raise(this, e);
    }

    protected void OnPropertyChanged(string propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    } 

이것이 그들이 Model-view-viewmodel을 사용하는 방법입니다.

그러나 부울에 바인딩되기를 원하기 때문에 변환기가 필요합니다. 또 다른 방법은 외부에 부울을 설정하고 해당 버튼을 클릭 한 다음 property_advancedFormat을 원하는 가시성으로 설정하는 것입니다.


답변

Windows 10 15063 이상

Windows 10 빌드 15063 이후에는 Visibility를 bool 값에 기본적으로 바인딩하는 “Implicit Visibility conversion”이라는 새로운 기능이 있습니다. 더 이상 변환기를 사용할 필요가 없습니다.

( https://social.technet.microsoft.com/wiki/contents/articles/34846.uwp-compiled-binding-windows-10-anniversary-update.aspx#Implicit_Visibility_conversion 참조 ).

내 코드 (MVVM과 템플릿 10도 사용한다고 가정) :

<!-- In XAML -->
<StackPanel x:Name="Msg_StackPanel" Visibility="{x:Bind ViewModel.ShowInlineHelp}" Orientation="Horizontal" Margin="0,24,0,0">
    <TextBlock Text="Frosty the snowman was a jolly happy soul" Margin="0,0,8,0"/>
    <SymbolIcon Symbol="OutlineStar "/>
    <TextBlock Text="With a corncob pipe and a button nose" Margin="8,0,0,0"/>
</StackPanel>

<!-- in companion View-Model -->
public bool ShowInlineHelp // using T10 SettingsService
{
    get { return (_settings.ShowInlineHelp); }
    set { _settings.ShowInlineHelp = !value; base.RaisePropertyChanged(); }
}