0

(C#4.0、Visual Studio 2010で)次のコードを実行しようとしています

VS2010 WPFアプリケーションプロジェクトのMainWindow.xaml.csにmyOrdersのインスタンス化を追加しましたが、XAMLを使用してます

データコンテキストが不明なため、シンボル' myOrders 'を解決できません

MainWindows.xamlで、次の行 のmyOrdersにマウスをポイントすると、次のようになります。

 ItemsSource="{Binding myOrders}"

この場合、WPFアプリを起動するための完全なXAMLスクリプトは何でしょうか?

アップデート:

回答やコメントを提供するのは冗長なので、コードを削除しました。私が最も単純なキックオフの図
に興味を持ったことに注意してください-データバインディングの実現:

  • 複合(階層または多次元/ジャグ配列またはリスト)List <>オブジェクト(C#でインスタンス化されますが、XAMLではインスタンス化されません)
  • 一種のマスターと詳細の関係を模倣する、TreeView

インターネットで準備ができていませんでした。

チュートリアル、ウォークスルー、または例のコードは、コンパイルされないか、概念とそれぞれの理解を曖昧にする複雑さによって肥大化していないことがわかりました。

つまり、私はそれが私のものではないので、私はそれを賛成したり正しいものとしてマークしたりすることはできませんが、 より単純なコードで消えた答えを好みます。

4

2 に答える 2

3

まず、myOrdersはパブリックプロパティである必要があります。パブリック変数であっても表示されません。次にDataContext = this;、ウィンドウのコンストラクターで設定する必要がある背後のコードで何が起こっているかをview(XAML)に認識させます。

次のようなプロパティを設定します。public List<Order> myOrder {get;set;}

コードビハインドからビューを更新する必要がある場合は、INotifyPropertyChangedインターフェイスを実装する必要があります。ビューの更新ジョブを実行する責任があります。これはMSDNからの小さなチュートリアルです。

最後に、(私の経験から)のObservableCollection<Order>代わりにtypeのプロパティを使用する必要がありList<Order>ます。

XAML:

<Grid>
  <ItemsControl  x:Name="visual"
                 ItemsSource="{Binding MyOrders}"
                 HorizontalAlignment="Stretch"
                 HorizontalContentAlignment="Stretch">
    <ItemsControl.ItemTemplate>
      <!-- This defines the DataTemplate to display one Order object-->
      <DataTemplate>
        <StackPanel>
          <TextBlock Text="{Binding OrderName}"
                     Margin="10" />

          <ItemsControl ItemsSource="{Binding PartsList}"
                        HorizontalAlignment="Stretch"
                        HorizontalContentAlignment="Stretch">
            <ItemsControl.ItemTemplate>
              <!-- This defines the DataTemplate to display one Parts object-->
              <DataTemplate>
                <Grid HorizontalAlignment="Stretch">
                  <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                  </Grid.ColumnDefinitions>
                  <TextBlock Grid.Column="0"
                             Text="{Binding PartName}"
                             TextAlignment="Center" />
                  <TextBlock Grid.Column="1"
                             Text="{Binding PartQuantity}"
                             TextAlignment="Center" />
                </Grid>
              </DataTemplate>
            </ItemsControl.ItemTemplate>
          </ItemsControl>
        </StackPanel>
      </DataTemplate>
    </ItemsControl.ItemTemplate>
  </ItemsControl>
</Grid>

背後にあるコード:

  /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
{
    public ObservableCollection<Order> MyOrders
    {
        get { return _myOrders; }
        set { _myOrders = value; OnPropertyChanged("MyOrders"); }
    }

    Order order1 = new Order
     {
         OrderName = "Order1",
         PartsList = new List<Parts>()
        {
            new Parts {PartName = "Part11", PartQuantity = 11},
            new Parts {PartName = "Part12", PartQuantity = 12}
        }
     };

    private ObservableCollection<Order> _myOrders;

    public MainWindow()
    {
        InitializeComponent();
        MyOrders = new ObservableCollection<Order>();
        MyOrders.Add(order1);
        DataContext = this;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}
    public class Order
    {
        public string OrderName { get; set; }
        public List<Parts> PartsList { get; set; }
    }

    public class Parts
    {
        public string PartName { get; set; }
        public double PartQuantity { get; set; }
        }
}
于 2013-01-23T06:57:48.233 に答える
0

より簡単な答え:
これは面白いですが、HichemC の答えでは、肥大化することなく同じ XAML で動作する C# コードの最後から 2 番目のエディションを編集している とは思いません。

  • ObservableCollection
  • OnPropertyChanged()
  • INotifyPropertyChanged
  • PropertyChangedEventHandler

この、より単純なコードが私のために機能すること:

public partial class MainWindow : Window
{
    public List<Order> myOrders { get; set; }
    Order order1 = new Order
    {
        OrderName = "Order1",
        PartsList = new List<Parts>()
        {
              new Parts {PartName = "Part11", PartQuantity = 11},
              new Parts {PartName = "Part12", PartQuantity = 12}
         }
     };
    Order order2 = new Order
    {
        OrderName = "Order2",
        PartsList = new List<Parts>()
        {
              new Parts {PartName = "Part21", PartQuantity = 21},
              new Parts {PartName = "Part22", PartQuantity = 22},
              new Parts {PartName = "Part23", PartQuantity = 23}
         }
     };

     public MainWindow()
        {
            InitializeComponent();
            myOrders = new List<Order>();
            myOrders.Add(order1);
            myOrders.Add(order2);
            DataContext = this;
        }
    }
    public class Order
    {
        public string OrderName { get; set; }
        public List<Parts> PartsList { get; set; }
    }

    public class Parts
    {
        public string PartName { get; set; }
        public double PartQuantity { get; set; }
        }
}

マスター/ディテール複合リスト オブジェクト WPF アプリでのデータ バインディング - 最も単純な実現

于 2013-01-23T10:38:21.830 に答える