2011-03-16 6 views
8

코드 숨김의 const 값에 속성을 바인딩하는 좋은 방법이 있습니까? 내가 콤보 상자를 사용하면WPF에서 xaml의 코드 뒤에 const 멤버를 바인딩

, 나는 보통 뒤에 XAML 코드에서이 방법을 수행

XAML :

<ComboBox Name="cbBuz"> 
    <ComboBoxItem Content="foo" Uid="foo" IsSelected="true" /> 
    <ComboBoxItem Content="bar" Uid="bar" /> 
</ComboBox> 

Codebehind가 :

ComboBoxItem item = cbBuz.GetSelectedItem(); 
switch (item.Uid) 
{ 
    case "foo": ... break; 
    case "bar": ... break; 
} 
나는이 방법을 선택하는 이유는

다음 :

  • ocalization purpose, 마지막으로 선택한 항목을 저장하고로드하는 동안 선택한 항목을 확인하는 데 Content string을 사용해서는 안됩니다.
  • 간단히하기 위해 XAML과 코드 숨김은 내부 식별자 (이 경우 Uid)에 연결해야합니다. 따라서 XAML과 코드 숨김은 별도로 유지 관리 할 수 ​​있습니다.

은 그러나, 유지 보수 현명한는 내부 식별자는 다음과 같이 한 곳에서 정의되어야한다 : 문제는 겉으로는 속성이 CONST 값이 될 수있다

//IDs 
public const string ID_foo = "foo"; 
public const string ID_bar = "bar"; 

... 

// 
switch (item.Uid) 
{ 
    case ID_foo: ... break; 
    case ID_bar: ... break; 
} 

을, 그래서 ID_foo을 결합 할 수있는 방법이 없습니다 및 이 같은 ComboBoxItem의 UID에 ID_bar :

//If ID_foo and ID_bar are properties, this will work. 
<ComboBox Name="cbBuz"> 
    <ComboBoxItem Content="foo" Uid="{Binding ID_foo}" IsSelected="true" /> 
    <ComboBoxItem Content="bar" Uid="{Binding ID_bar}" /> 
</ComboBox> 

그래서, 나는이 문제를 해결하는 방법을 알고 싶어요. 또는이를 구현하는 더 좋은 방법이 있습니까? 너무 좋을 것입니다. 이 속성에되면, 바인딩을 통해 사용할 수있을

private const string ID_Foo = "foo"; 
public string FooId 
{ 
    get { return ID_Foo; } 
} 

:

최저

,

답변

18

당신은 지금처럼 StaticExtension를 사용하여 더 나을 것 : 지역이 클래스의 C#을 네임 스페이스에 대한 XMLNS 별칭이다

Uid="{x:Static local:YourClass.ID_foo}" 

. 자세한 내용은 here을 참조하십시오.

바인딩을 사용할 때의 문제점은 변경되지 않는 무언가에 많은 오버 헤드를 추가한다는 것입니다. 바인딩은 귀하의 속성을 모니터하려고합니다. 또한 known "leaks"이 있으며 INotifyPropertyChanged를 구현하지 않는 개체에 대한 종속성이없는 속성을 사용하여 바인딩을 사용합니다.

+0

고마워요! 이것은 내가 원하는 것입니다!또한, 누수와 오버 헤드와 관련된 정보는 실제로 유용합니다. – Aki24x

2

당신은 (A CONST에 정의 된) 상수를 반환하는 속성, 즉를 확인해야합니다.

+0

아, 맞습니다. 이것을 더 짧게 만들 수있는 방법이 있습니까? C++이라면 #define을 사용하여 매크로를 만들 수는 있지만 그렇게 할 수는 없습니다. ComalBox에 새로운 Uid를 추가 할 때 IValueConverter와 Enum이 더 짧아 질 수 있을지 궁금합니다. 전체 코드의 양과 관련해서가 아닙니다. – Aki24x

+1

@ Aki24x : 잠재적으로 IValueConverter를 통해이 작업을 수행하고 대신 XAML의 값을 바인딩 (바인딩이 아닌)으로 지정할 수 있습니다. 하나의 IValueConverter가 어떻게 든 조회를 수행 할 수는 있지만 조회 할 항목이 필요합니다. 즉, 사전의 이름을 사용하거나 열거 형을 사용하거나 ... –

+0

알 수 있습니다. 고마워, 리드. =) – Aki24x

관련 문제