2012-08-10 3 views
1

WPF에서 콤보 상자를 만들 때 "선택"과 같은 이름이 필요합니다. 일반적인 단추 였고 클릭 할 때와 같이 항목 만 필요합니다. 드롭 다운, 콤보 상자의 이름이 아닙니다. 내 질문을 이해하길 바래? 이 문제를 해결할 방법이 있습니까?WPF의 콤보 상자에있는 이름

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

그리고이 같은 C# 코드에 항목을 추가 : 다음 XAML에서

나는 콤보 상자에 대해이 작업을 사용

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

왜 사용자가 클릭 할 때 콤보 상자의 이름 (= "선택 사항")을 사라지게 하시겠습니까? 사용자가 comboxbox를 클릭하면 (이름이 사라짐) 직접 외부에서 클릭하면 어떻게됩니까? – franssu

+0

콤보 상자 위에 레이블 컨트롤을 오버레이하려고합니까? – NoviceProgrammer

+0

아니, 나는 그것을 사라지고 싶지 않아, 나는 단지 두 번 싶지 않아! 내 코드가 이제 "버튼"과 드롭 다운 항목 모두에서 "선택"을 얻습니다. –

답변

2

내가 가시성의 콤보를 통해 TextBlock에 갈 것이다 (변환기를 통해) ComboBox의 selectedItem에 바인딩됩니다.

<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; 
    } 

OR, 더 나은 솔루션 : 순수 XAML 사용하여 트리거 :

myContentControl.DataContext = Enum.GetValues(typeof([YOUR ENUM])); 
+0

이것은 또한 (필자의 의견으로는) 바람직한 사용법 인 트리거를 사용하여 수행 할 수 있습니다. –

+0

Piotr Ptak, 감사합니다. 내 대답에 트리거를 사용하는 솔루션을 추가했습니다. – franssu

2

: 코드 숨김에서 콘텐츠 컨트롤의 데이터 컨텍스트를 설정하는 것을 잊지 마세요이 경우

<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> 

사용해보기, 방금 테스트했습니다.

<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"> 
+0

좋아요,하지만 "Your choice"라는 이름을 써야합니까? –

+0

strChangeRoute에서 "Your choice"도 제거 하겠음 –

+0

흠, 괜찮습니다.하지만 첫 번째 항목으로 빈 흰색 줄이 생깁니다!? 그것을 제거하는 방법이 있습니까? –

2

바인딩을 사용해 보셨습니까?

XAML에서

당신은 (코드 숨김) 생성자에 다음

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

같은, 그냥 당신이 실제로 코드를 보일 것이다 결합하는 라인

그래서
this.DataContext = this; 

를 추가해야 종속성 속성 인 ChosenValue를 찾기 위해. 이렇게하면 콤보 상자의 값이 변경 될 때마다 현재 선택된 항목을 보유하기 위해 소품 값이 업데이트됩니다.

, 당신이 원하는 것을 달성 단지 생성자 마찬가지로

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

에 소품의 값을 "선택"을 설정하려면, 당신이 원하는 다른 곳에 같은 문자열로 값을 설정합니다. 저장하는 등 무엇이든 그냥 확인하십시오

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

희망이 도움이 되셨습니다.

+0

FYI : 네 공백으로 코드를 들여 쓸 때 백틱을 추가 할 필요가 없습니다. 역 인용 부호는 인라인 코드 블록에만 필요합니다. – quetzalcoatl

+0

알겠습니다. 고마워! 이것은 나의 첫 번째 대답이므로, 어떻게 작동하는지 완전히 확신하지 못했습니다. – Dorian

2

실제로 원하는 것은 콤보 상자를 구성하는 것이 아니라 그 위에 adorner/decorator를 추가하는 것입니다. 콤보가 닫힌 상태에서 텍스트가 표시되고 콤보가 작동하지 않을 때 숨길 수 있습니다. 때로는 "워터 마킹"이라고도합니다.

나는 무의미하기 때문에 더 설명하지 않겠다. 좋은 기사는 다음과 같습니다. http://pwlodek.blogspot.com/2009/11/watermark-effect-for-wpfs-textbox.html combobox를 워터 마킹하는 데 필요한 모든 코드가 있습니다.

당신이 하나를 참조 할 수 있습니다
0

, How to display default text "--Select Team --" in combo box on pageload in WPF?

나는이 포럼에서 아래의 솔루션을 제안,

당신이 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" /> 

여기서 변환기는 변환기 클래스를 배치 한 장소입니다. 예는 다음과 같습니다

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

이 방법에 대한 매우 좋은 점은 뒤에 코드에서 코드의 더 반복하지 않는다.

관련 문제