2013-03-10 3 views
1

이제 XAML을 GUI 용으로 사용해 보았습니다. (학습하면서 ...) XAML과 C#에서 문제없이 데이터 바인딩을 수행 할 수있었습니다. 또 다른,하지만 지금은 가치를 앞뒤로 전달해야 할 때가 왔고 나는 조금 잃어 버렸습니다. 컴파일하고 페이지를 탐색하려고하면 XamlParseException가 발생합니다. 지정된 클래스 이름이 실제 루트 인스턴스 유형과 일치하지 않습니다. 클래스 지시문을 제거하거나 XamlObjectWriterSettings.RootObjectInstance를 통해 인스턴스를 제공하십시오. 5 호선 위치 2.데이터 바인딩을 위해 C#에 XAML로드

어떤 도움이나 올바른 방향으로 부드럽게 밀쳐이 크게 감사합니다 :)

다음

는 내가 어디 :

namespace TheAirline.GraphicsModel.PageModel.PageFinancesModel 
{ 
    /// <summary> 
    /// Interaction logic for PageFinances.xaml 
    /// </summary> 
    public partial class PageFinances : Page 
    { 
     private Airline Airline; 

     public PageFinances(Airline airline) 
     { 
      InitializeComponent(); 
      this.Language = XmlLanguage.GetLanguage(new CultureInfo(AppSettings.GetInstance().getLanguage().CultureInfo, true).IetfLanguageTag); 

      this.Airline = airline; 
      Page page = null; 
//loading the XAML 
      using (FileStream fs = new FileStream("TheAirline\\GraphicsModel\\PageModel \\PageFinancesModel\\PageFinances.xaml", FileMode.Open, FileAccess.Read)) 
      { 
      page = (Page)XamlReader.Load(fs); 
      } 
//finding XAML element and trying to set the value to a variable 
      string airlineCash = GameObject.GetInstance().HumanAirline.Money.ToString(); 
      TextBox cashValue = (TextBox)page.FindName("cashValue"); 
      cashValue.DataContext = airlineCash; 
     } 
    } 
} 

그리고 XAML의 처음 몇 줄을 :

XAML에서
<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:AirlineModel="clr-namespace:TheAirline.Model.AirlineModel" 
    mc:Ignorable="d" 
x:Class="TheAirline.GraphicsModel.PageModel.PageFinancesModel.PageFinances" 
    xmlns:c="clr-namespace:TheAirline.GraphicsModel.Converters" 
...> 
</Page> 
+0

당신의 진술'나는 XAML과 C#에서 서로 독립적으로 데이터 바인딩을 할 수 있었지만 지금은 값을 앞뒤로주고 나는 약간 잃어버린 시간이왔다 '는 것이 완전하다. 모순 된. 당신이'DataBind'라면'DataBinding''ITSELF'가 데이터를 앞뒤로주고 있습니다. 나는 네가 의미하는 것을 이해하지 못한다. 또한,'TextBox cashValue = (TextBox) page.FindName ("cashValue");와'cashValue.DataContext = airlineCash;'와 같은 일을하면 안된다. 필요한 것을 지정해 주시면 도와 드리겠습니다. –

+0

XAML의 기능과 장점을 배우면서 조금 모호한 (모순되는) 경우 미안합니다. 어쨌든 - 슬라이더의 값을 XAML 또는 C#의 텍스트 상자에만 바인딩 할 수 있지만 XAML에서 만든 값을 C#의 변수에 바인딩하거나 그 반대로 바인딩 할 수는 없습니다. 나는 그것이 더 의미가 있기를 바란다 :) – mikedugan

답변

1

Bindings 은 주어진 XAML 요소의 DataContext 속성에 할당 된 객체에 대해 해결됩니다. 해당 속성의 값 (많은 다른 속성들도 포함) Is Inherited (부모 요소에서 자식 요소까지)은 Visual Tree입니다.

public namespace MyNamespace 
{ 
    public class ViewModel 
    { 
     public string Name {get;set;} 
     public bool IsActive {get;set;} 
    } 
} 

이 XAML :

이 클래스의 지정된 인스턴스에 대한

, XAML에 정의

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:MyNamespace" 
     FontSize="20"> 
    <Window.DataContext> 
     <local:ViewModel> 
    </Window.DataContext> 
    <StackPanel> 
     <TextBox Text="{Binding Path=Name}"/> 
     <CheckBox IsChecked="{Binding Path=IsActive}"/> 
    <StackPanel> 
</Window> 

네 오브젝트는 WindowStackPanelTextBoxCheckBox, 윌 FontSize은 20이고, ViewModel 클래스의 인스턴스는 DataContext 속성에 할당됩니다. 따라서 모든 바인딩 (지정된 ElementName, RelativeSource 또는 Source의 바인딩 제외)은 해당 인스턴스에 대해 해결됩니다.

속성이 코드 대신 XAML에 할당 된 경우 정확히 같은 것이다 :이 때문에

public MyWindow() //Window Constructor 
{ 
    InitializeComponent(); 
    this.DataContext = new ViewModel(); //Note that keyword "this" is redundant, I just explicity put it there for clarity. 
} 

, 프레임 워크로, 명시 적으로 각 요소에 DataContext 속성을 설정 할 필요가 없다 이미 그 일을 돌보고 있습니다.

또한 XAML에서 기본 제공되는 Markup Extensions에는 기본 생성자 규칙이 있으므로 사용법을 약식으로 지정할 수 있습니다. 될 수있는 기본의 DataContext의 프로퍼티의 변경을 위해,

<TextBox Text="{Binding Name}"/> 

지금 :

<TextBox Text="{Binding Path=Name}"/> 

정확히 같은 경우 : Binding Markup Extension의 경우, 기본 생성자 그러므로이는 Path 속성이 있습니다 바인딩 소스 (ViewModel)에서 바인딩 대상 (XAML 정의 된 개체)으로 자동 전달 된 경우 원본 개체는 System.ComponentModel.INotifyPropertyChanged 인터페이스를 구현하고 속성이 변경 될 때마다 PropertyChanged 이벤트를 발생시켜야합니다.

따라서, 양방향 바인딩을 지원하기 위해, 예를 들어 클래스는 다음과 같아야합니다

public namespace MyNamespace 
{ 
    public class ViewModel: INotifyPropertyChanged 
    { 
     private string _name; 
     public string Name 
     { 
      get 
      { 
       return _name; 
      } 
      set 
      { 
       _name = value; 
       NotifyPropertyChanged("Name"); 
      } 
     } 

     private bool _isActive; 
     public bool IsActive 
     { 
      get 
      { 
       return _isActive; 
      } 
      set 
      { 
       _isActive = value; 
       NotifyPropertyChanged("IsActive"); 
      } 
     } 
    } 

    public void NotifyPropertyChanged (string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName); 
    } 
} 

ViewModel 클래스는 XAML 정의 개체 중 하나에 종속 또는 직접 참조가없는 공지 것으로, 그러나 여전히 UI에 나타날 속성의 값을 포함합니다. 이를 통해 MVVM Pattern으로 알려진 UI와 응용 프로그램 논리/데이터간에 완벽한 분리가 가능합니다. C# + XAML로 프로그래밍하는 데 성공한다면이 주제에 대한 연구를 제안합니다. 이는 다른 전통적인 UI 패러다임과 비교했을 때 급진적 인 변화입니다.

는 예를 들어,이 같은 일이 XAML 기반 응용 프로그램에서 사용하지 않는 것이 좋습니다 : 그건 당신이 UI 요소의 상태에 의존 애플리케이션 로직을 결합하고하고 있다는 것을

if (myWindow.CheckBox1.IsChecked) 
    //Do Something 

의미하기 때문에 어떤 정확하게 당신이 피할 필요가있는 것입니다.

이 대답에서 참조하는 모든 링크와 모든 개념은 WPF와 관련이 있지만 Silverlight 및 WinRT에도 적용됩니다. 사용중인 세 개의 XAML 기반 프레임 워크 중 어느 것을 지정하지 않았으므로 WPF 프레임 워크를 게시했습니다. 이는 내가 가장 잘 알고있는 것입니다.

+0

답을 고맙다. 내 문제는 로컬에서 다소 단순한 것으로 밝혀졌지만 사용자의 대답은 내가 아직 가지고 있지 않은 많은 배경 정보를 제공했습니다. :) – mikedugan

관련 문제