0

私はC#で最初のGUIを作成しており、WPFとMVVM(これが私が使用しているアプローチです)に関するチュートリアルをたくさん見たり読んだりしましたが、直感的に達成するのはかなり簡単なはずです。リストボックスがあり、その上に「リストからアイテムを選択してください」というテキストブロックまたはラベルを表示し、アイテムが選択されると消えます。

どうすればこれを達成できますか? コードビハインドに書き込む必要がありますか? 私が読んだほとんどのチュートリアルでは、コード ビハインドを使用することは推奨されていないため、別のソリューションを使用することをお勧めします。これは XAML 内から直接行うことはできないと思います。そのため、リストボックスの状態を保持するために ViewModel 変数を作成する必要がありますか?? もしそうなら、変数に依存するテキストブロック/ラベルを作成するにはどうすればよいですか?

4

4 に答える 4

1

これを XAML でのみ行う場合

<StackPanel>
    <TextBlock Text="Please select an item!">
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Setter Property="Visibility" Value="Collapsed" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding SelectedItem, ElementName=lb}" Value="{x:Null}">
                        <Setter Property="Visibility" Value="Visible" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
    <ListBox Name="lb" ItemsSource="12345" />
</StackPanel>

ItemsSource="12345"デモ用に 5 つの行を作成します。

于 2012-07-24T16:08:28.180 に答える
1

ビューモデルで、公開ブール プロパティ「VisibilityOfLabel」を作成します。

private bool visibilityOfLabel;

public bool VisibilityOfLabel 
{
     get
     {
         return visibilityOfLabel;
     } 

     set
     {
         visibilityOfLabel = value;
         RaisePropertyChanged("VisibilityOfLabel");
     }
}

XAML で、既に DataContext を ViewModel に設定している場合は、Label Visibility をそのプロパティにバインドします。

<Label Content="{Binding LabelText}" Visible="{Binding VisibilityOfLabel}" />

次に、コンボボックスが変更されたら、値を true または false に設定するだけです

編集 ここで可視性を使用する必要があります。System.Windows.Controls.BooleanToVisibilityConverterには、組み込みのコンバーターが既に用意されています。

于 2012-07-24T16:05:49.853 に答える
0

あなたは正しいです。選択したリスト ボックス項目を保持するビューモデル変数を作成します。テキストブロックの可視性を保持する別の変数も作成します。次に、ビューモデルからテキスト ブロックの可視性を設定できます。

private string _selectedListBoxItem;
private boolean _textBlockVisibility

public string SelectedListBoxItem
{
get {return _selectedListBoxItem;}
set{_selectedListBoxItem=value;
_textBlockVisibility=false;}
}

public Boolean TextBlockVisibilty
{
get{return _textBlockVisibility;};
set {_textBlockVisibility=value;};
}

xaml は、テキスト ブロックの可視性を TextBlockVisibility にバインドします。可視性コンバーターを使用する必要があります。何かのようなもの:

 public class BooleanVisibilityValueConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                if (((bool)value) == true)
                    return Visibility.Visible;
                else
                    return Visibility.Collapsed;
            }

            return Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {

            throw new Exception("The method or operation is not implemented.");

        }


    }
于 2012-07-24T16:09:44.213 に答える
0

ビュー モデルのアプローチは完全に有効ですが、ビュー モデルに依存せずに XAML で完全に行うことができます。

<StackPanel>
  <TextBlock Text="Please make a selection">
    <TextBlock.Style>
      <Style>
        <Setter Property="Visibility" Value="Hidden" />
        <Style.Triggers>
          <DataTrigger Binding="{Binding ElementName=TheListBox, Path=SelectedIndex}" Value="-1">
            <Setter Property="Visibility" Value="Visible" />
          </DataTrigger>
        </Style.Triggers>
      </Style>
    </TextBlock.Style>
  </TextBlock>

  <ListBox x:Name="TheListBox" ... />
</StackPanel>

ここで行っているのは、選択が行わSelectedIndexれるまでのどちらになるかを監視することだけです。-1値が でなくなる-1と、テキスト ブロックは非表示になります。私がこのアプローチを気に入っている 2 つの理由:

  1. 書くコードが少ない
  2. これは厳密にはビュー ロジックであり、目的の動作を実現するためにビュー モデルは必要ありません。
于 2012-07-24T16:36:26.300 に答える