2011-06-15 6 views
0

"var mainpage new Mainpage()"시도 메인 페이지 생성자를 실행하면 XAML 개체의 모든 필드가 null로 반환됩니다. Silverlight에서 다른 클래스이지만 같은 네임 스페이스의 일부인 XAML 개체에 액세스하는 방법main이 아닌 클래스에서 XAML 개체에 액세스하려면 어떻게합니까?

예를 들어 설명하겠습니다. 당신이 첫 번째 대답을 보면, 여기에 내가

public class MyPage 
{ 
    MyPage() 
    { 

     // the constructor makes all the variables from the xaml null 
    } 

    public TextBox MyTextBox 
    { 
     get { return SomeTextBox; } 
    } 
} 


public class SomeOtherClass 
{ 
    private void SomeFunction() 
    { 
     var page = new MyPage(); // this makes the text empty 
     var sometext = page.MyTextBox.Text; // so sometext will be empty 
    } 
} 

가 발생하고 그래서 SomeFunction을 실행할 때 어떤 프로그램을 먼저 실행 사용자 imputs가 null로 전환하는 것이다.

내가 처음 시도하는 것은 SomeClass가 만들어지면 그 클래스에 값이 들어 있는지 확인하는 것입니다.

이것이 실패하면 MVVM을 사용해 보겠습니다. 보기 여기

namespace SimpleMVVM.Model 
{ 
    public class SimpleModel 
    { 
     // super easy version 
     //public string SomeSimpleValue { get; set; } 

     private string _SomeSimpleValue = string.Empty; 

     // actually do something version... 
     public string SomeSimpleValue 
     { 
      get 
      { 
       return "some value"; 
      } 
      set 
      { 
       _SomeSimpleValue = value; 
      } 
     } 
    } 
} 

됩니다 :

와 나는 http://www.vimeo.com/8915487 비디오를 본 나는 샘플 MVVM 코드 여기

을받은 모델입니다 여기에 viewmodel.cs가 있습니다.

using Simple; 
using SimpleMVVM.Model; 

namespace SimpleMVVM.ViewModel 
{ 
    public class SimpleViewModel : SimpleViewModelBase 
    { 
     private SimpleModel MyModel = new SimpleModel(); 

     public string SomeSimpleValue 
     { 
      get { return MyModel.SomeSimpleValue; } 
      set 
      { 
       if (MyModel.SomeSimpleValue != value) 
       { 
        MyModel.SomeSimpleValue = value; 
        RaisePropertyChanged("SomeSimpleValue"); 
       } 
      } 
     } 
    } 
} 

ViewModel을 주입 한 다음 모델 및 뷰에서 바인딩을 변경하는 것만 큼 쉬운지 궁금합니다.

MVVM이 정말 쉽습니까?

하나 더 있습니다. 그것은 그래서 지금, 어려운 부분 뷰 모델의 기본 클래스

using System.ComponentModel; 

namespace Simple 
{ 
    public class SimpleViewModelBase : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     public void RaisePropertyChanged(string PropertyName) 
     { 
      var e = new PropertyChangedEventArgs(PropertyName); 
      PropertyChangedEventHandler changed = PropertyChanged; 
      if (changed != null) changed(this, e); 
     } 
    } 
} 

OK입니다. 새로운 수업을 만들면. viewmodel 클래스에서 데이터를 얻으려면 어떻게해야합니까?

+0

예, MVVM은 간단합니다 (버튼 클릭과 같은 UI 동작을 처리해야 할 때 더욱 복잡해집니다). 개인적으로 위의 MVVM 패턴에 동의하지 않지만 지금은 수행 할 것입니다. 추가 질문이 있으면 새로운 질문을 올리십시오. – slugster

답변

3

우선,이 호언 장담을 꺼내겠습니다 : 제안하는 것은 매우 나쁜 디자인입니다. smelly code의 정의와 일치합니다.

이렇게하는 것이 가장 중요하다면 페이지에서 실제 UI 요소를 반환하는 일부 공용 변수를 선언하는 것이 가장 좋습니다.

<UserControl x:Class="MyNamespace.MyPage" ...> 
    <Grid> 
     <TextBox x:Name="SomeTextBox" Width="100" /> 
    </Grid> 
</UserControl> 


public class MyPage 
{ 
    public TextBox MyTextBox 
    { 
     get { return SomeTextBox; } 
    } 
} 


public class SomeOtherClass 
{ 
    private void SomeFunction() 
    { 
     var page = new MyPage(); 
     page.MyTextBox.Text = "some text"; 
    } 
} 

물론 선호하는 방법은 다음 방금, 뷰 모델에서 당신이 접촉을 시도하지 않도록 이런 식으로 속성 값을 읽을 수는 뷰 모델에 창에서 바인딩을 구현하기 위해 MVVM 패턴 같은 것을 사용하는 것 전혀 다른 클래스의 UI 요소.

전체 MVVM 경로를 사용하지 않고 다른 방법으로 인스턴스화 할 컨트롤/페이지의 생성자에 필요한 값을 주입 한 다음 적절한 값을 UI 요소 속성에 할당 할 수 있습니다. 여전히 냄새가 있지만 외부에서 UI 요소에 직접 액세스하는 것보다 낫습니다.

+0

당신이주는 코드 예제의 문제점은 내가 겪고있는 정확한 문제입니다. MyPage에 대한 생성자 methof가 있음을 설명합니다. "var page = new MyPage();"를 호출하면 MyPage 클래스의 생성자를 호출합니다. 이 생성자는 SomeTextBox의 모든 값을 null로 만듭니다. MyTextBox에서 텍스트를 설정하려는 경우에는 문제가 없지만 그 반대를 원합니다. 나는 이미있는 텍스트를 읽고 싶다. – xarzu

+0

원본 게시물을 편집하려고합니다. MVVM을 사용하여이 작업을 수행 할 것입니다. – xarzu

+0

@ xarzu - 내가 이미 거기에있는 텍스트를 읽고 싶습니다. * 틀렸을 때 - 아직 텍스트가 없습니다. 페이지가 생성되지 않았기 때문에 ** 텍스트가 될 수없고, 컨스트럭터가 텍스트를 무효화하기 위해서 텍스트를 넣는 것은 무의미하다. ** OnLoad 또는 OnShow 이벤트 처리기에서 ** 생성자가 실행 된 후 페이지가 텍스트를 가져 오는 것 (또는 기본 텍스트를 배치하는 것)하는 것처럼 들립니다. – slugster

관련 문제