1

WPFでコンボボックスを作成するときに、「あなたの選択」のような名前を付けたいのですが、それが共通のボタンであり、クリックすると、コンボボックスの名前ではなく、項目のみをドロップダウンしたいのと同じですまた。私の質問を理解していただければ幸いです。これを解決する方法はありますか?

XAML では、コンボ ボックスにこれを使用します。

<ComboBox Height="23" HorizontalAlignment="Left" Margin="110,226,0,0" Name="cmbChangeRoute" VerticalAlignment="Top" Width="156" SelectionChanged="cmbChangeRoute_SelectionChanged" />

そして、次のように C# コードに項目を追加します。

string[] strChangeRoute = new string[] { "Your choice", "10 deg", "20 deg", "30 deg" };
foreach (string s in strChangeRoute)
     cmbChangeRoute.Items.Add(s);
cmbChangeRoute.SelectedIndex = 0;
4

5 に答える 5

2

バインディングを使ってみましたか?

XAMLでは次のようなものがあります

<ComboBox ... SelectedItem="{Binding ChosenValue,Mode=TwoWay}" ... />

次に、コンストラクター(コードビハインド)に次の行を追加します

this.DataContext = this;

バインディングが実際にコードビハインドを調べて依存関係プロパティChosenValueを見つけるようにします。このように、コンボボックスの値が変更されるたびに、プロップの値が更新され、現在選択されているアイテムが保持されます。

目的を達成するには、コンストラクターで小道具の値を「YourChoice」に設定するだけです。

public ClassName()
{
   InitializeComponent();
   this.DataContext = this;
   ChosenValue = "Your Choice";
}

同様に、他のすべての場所でその値を同じ文字列に設定するだけです。保存するときなどは、チェックするだけです

if(!ChosenValue.Equals("Your Choice")
{
   //do logic
}
else
{
   //the user has not selected anything
}

お役に立てれば!

于 2012-08-10T09:45:05.613 に答える
2

実際には、ComboBoxを構成するのではなく、その上に装飾/デコレーターを追加します。これにより、コンボが閉じている間はテキストが表示され、コンボがダウンしているときは非表示になります。「透かし」と呼ばれることもあります。

それは無意味なので、これ以上説明しません。ここに素晴らしい記事があります:http://pwlodek.blogspot.com/2009/11/watermark-effect-for-wpfs-textbox.htmlコンボボックスに透かしを入れるために必要なすべてのコードスニッペストもあります。

于 2012-08-10T09:50:47.737 に答える
2

可視性が ComboBox の selectedItem に (コンバーターを介して) バインドされる ComboBox よりも TextBlock を使用します。

<Grid>
    <ComboBox x:Name="myComboBox" />
    <TextBlock  Text="Your choice.." 
                IsHitTestVisible="False"
                Visibility="{Binding ElementName=myComboBox, Path=SelectedItem,
                  Converter={StaticResource yourChoiceLabelVisibilityConverter}}"/>
</Grid>

public class YourChoiceLabelVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
                          System.Globalization.CultureInfo culture)
    {
        if (value == null)
        {
            return Visibility.Visible;
        }

        return Visibility.Hidden;
    }

または、より良い解決策: 純粋な xaml、トリガーを使用:

    <ContentControl x:Name="myContentControl" Content="{Binding}">
        <ContentControl.ContentTemplate>
            <DataTemplate>
                <Grid>
                    <ComboBox x:Name="myComboBox" ItemsSource="{Binding}"/>
                    <TextBlock x:Name="myTextBlock"
                               Text="Your choice.."
                               IsHitTestVisible="False"
                               Visibility="Hidden"/>
                </Grid>
                <DataTemplate.Triggers>
                    <Trigger SourceName="myComboBox" Property="SelectedItem"
                             Value="{x:Null}">
                        <Setter TargetName="myTextBlock" Property="Visibility
                                Value="Visible"/>
                    </Trigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ContentControl.ContentTemplate>
    </ContentControl>

この場合、分離コードからコンテンツ コントロールのデータ コンテキストを設定することを忘れないでください。

myContentControl.DataContext = Enum.GetValues(typeof([YOUR ENUM]));
于 2012-08-10T09:31:20.420 に答える
2

これを試してみてください、私はちょうどそれをテストしました

<ComboBox Height="23" HorizontalAlignment="Left" Margin="110,226,0,0" Name="cmbChangeRoute" VerticalAlignment="Top" Width="156" IsManipulationEnabled="False" IsEditable="True" Text="Your Choice..." SelectionChanged="cmbChangeRoute_SelectionChanged">
于 2012-08-10T09:35:05.100 に答える
0

これを参照でき ます。 WPF のページロード時にコンボ ボックスにデフォルト テキスト "--Select Team --" を表示する方法は?

このフォーラムから以下の解決策を提案します。

IValueConverter を使用すると、コード ビハインドなしでこれを行うことができます。

<Grid>
   <ComboBox
       x:Name="comboBox1"
       ItemsSource="{Binding MyItemSource}"  />
   <TextBlock
       Visibility="{Binding SelectedItem, ElementName=comboBox1, Converter={StaticResource NullToVisibilityConverter}}"
       IsHitTestVisible="False"
       Text="... Select Team ..." />
</Grid>

ここに、再利用できるコンバーター クラスがあります。

public class NullToVisibilityConverter : IValueConverter
{
    #region Implementation of IValueConverter

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value == null ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

最後に、リソース セクションでコンバーターを宣言する必要があります。

<Converters:NullToVisibilityConverter x:Key="NullToVisibilityConverter" />

Converters は、コンバーター クラスを配置した場所です。例は次のとおりです。

xmlns:Converters="clr-namespace:MyProject.Resources.Converters"

このアプローチの非常に優れた点は、コード ビハインドでコードを繰り返さないことです。

于 2012-08-10T10:10:41.393 に答える