2013-02-12 5 views
1

내 WPF 응용 프로그램의 CLR 속성에서 종속성 속성으로 이동했습니다. 다음 코드는 다른 여러보기 모델에서 액세스해야하는 기본 클래스에 있다는 점에서 문제가 있습니다. CLR 속성 일 때 정적 이었지만 현재는 그렇지 않으므로 항상 설정하지 않은 뷰 모델에서 null을 반환합니다. 이 둘 사이에 방법이 있을까요?기본 클래스에서 정적이 될 종속성 속성이 필요합니다.

public Tuple<Guid, string> SelectedEntity 
    { 
     get { return (Tuple<Guid, string>)GetValue(SelectedEntityProperty); } 
     set { SetValue(SelectedEntityProperty, value); } 
    } 

    public static readonly DependencyProperty SelectedEntityProperty = 
     DependencyProperty.Register("SelectedEntity", typeof(Tuple<Guid, string>), typeof(MyViewModelBase), new PropertyMetadata(null)); 
+4

왜 처음에는 종속성 속성을 사용하고 있습니까? 내가 아는 한, 데이터 바인딩을 가능하게하는 컨트롤 (예 : XAML)에 사용되고, 뷰 모델은'INotifyPropertyChanged' 구현에 충실해야하며 그게 전부다. –

+0

나는 라인 아래 혜택 때문에 팀 리더. – Retrocoder

+5

팀 리더에게 알려주십시오. 뷰 모델에서는 종속성 속성이 적합하지 않습니다. 그냥'INotifyPropertyChanged'를 구현하십시오. 이렇게하면 뷰 모델이 WPF와 독립적으로 유지되므로 DependencyObject에서 모든 VM 클래스를 파생시킬 필요가 없습니다. – Clemens

답변

-2

무의미한 (디자인을 다시 생각해 봐야합니다.) 해킹을하면 바인딩에 대해서만 작동합니다.

종속성 속성 getters/setters는 DependencyObject에 정의 된 GetValueSetValue 메서드에 액세스합니다.

이러한 메서드는 인스턴스 메서드입니다. 따라서 일부 유형 인 인스턴스에서 호출해야합니다.

정적 DP에 바인딩 할 수있는 동안 은 XAML에서이라고 읽을 수 있으며 바인딩에서 모든 변경 알림을 잃을 수있는 제한 사항이 있습니다. 이것을 보여주는 최소한의 재현이 있습니다.

다음은 정적 클래스가있는 창과 유형의 클래스입니다.

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = new StaticDpsAreGoofy(); 
    } 
    private void ERMAGERD(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show(StaticDpsAreGoofy.Lol, "ERMAGERD"); 
     StaticDpsAreGoofy.Lol = "ERMAGERD"; 
    } 
} 

public sealed class StaticDpsAreGoofy : DependencyObject 
{ 
    public static readonly DependencyProperty LolProperty = 
     DependencyProperty.Register(
      "Lol", 
      typeof(string), 
      typeof(StaticDpsAreGoofy), 
      new UIPropertyMetadata("You have GOT to be kidding me")); 

    public static string Lol 
    { 
     get { return (string)_omgHack.GetValue(LolProperty); } 
     set { _omgHack.SetValue(LolProperty, value); } 
    } 

    private static readonly DependencyObject _omgHack = new DependencyObject(); 
} 

공지 사항, 나는 재산 (_omgHack)의 값을 "유지"할 DependencyObject의 인스턴스를 사용하는 것을 의미 staticLol 속성을 표시하고 있습니다.

다음은 XAML

<Window 
    x:Class="StaticDP.MainWindow" 
    xmlns:t="clr-namespace:StaticDP" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
     <Label>From instance</Label> 
     <TextBox 
      Text="{Binding Lol}" /> 
     <Label>From type</Label> 
     <TextBox 
      Text="{Binding Mode=OneWay, 
       Source={x:Static t:StaticDpsAreGoofy.Lol}}" /> 
    <Button 
     Click="ERMAGERD">ERMAGERD</Button> 
    </StackPanel> 
</Window> 

정적 바인딩에 공지 Binding Mode=OneWay의 사용의 예이다. 이것을 제거하고 정적 속성의 양방향 바인딩을 시도하면 이 바인딩은로드에서 실패합니다.

빌드하고 실행하면 두 텍스트 상자에로드시 예상 텍스트가 포함되어있는 것을 볼 수 있습니다. 그러나 첫 번째 TextBox의 텍스트를 변경 한 다음 버튼을 클릭하면 codebehind를 통해 액세스 한 값이나 UI의 바인딩이 업데이트되지 않습니다.

코드 숨김에서 값을 변경하면 UI의 값이 업데이트되지 않습니다.

tl; dr : 팀 리더는 자신이 말하는 것에 대해 알지 못합니다.

관련 문제