3

私はwpfを初めて使用するので、ここで明らかな何かが欠けている可能性があります。stackoverflow で同様の質問を見つけ、解決策 (以下のコードに実装されています) を試しましたが、うまくいきませんでした。リンクはこちら. 問題を説明しましょう。フレームワーク2010で作業しています。

1 つのデータグリッドと 3 つのボタンを含むユーザー コントロールがあります。同じのxamlは以下のとおりです。

<UserControl x:Class="RadarControls.RadarDataGrid"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
         xmlns:local="clr-namespace:RadarControls"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="25" />
    </Grid.RowDefinitions>

    <DataGrid Name="myGrid" Grid.ColumnSpan="3" ItemsSource="{Binding}" AutoGenerateColumns="True"></DataGrid>

    <Button Content="Add" Grid.Row="1" Height="23" Margin="0,2,2,0" HorizontalAlignment="Left" Name="btnAdd" Width="100" />
    <Button Content="Delete" Grid.Column="1" Grid.Row="1" Margin="0,2,2,0" Height="23" HorizontalAlignment="Left" Name="btnDelete" Width="100" />
    <Button Content="Save" Grid.Column="2" Grid.Row="1" Height="23" Margin="0,2,0,0" HorizontalAlignment="Left" Name="btnSave" Width="100" />
</Grid>
</UserControl>

このユーザーコントロールを使用しているウィンドウの xaml は次のとおりです。

<Window x:Class="RadarStudio.Users"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ctrls="clr-namespace:RadarControls;assembly=RadarControls"
    xmlns:vm='clr-namespace:RadarViewModel.Users;assembly=RadarViewModel'
    Title="Users" Height="300" Width="300">
<Grid >
    <ctrls:RadarDataGrid Name="grid1" DataContext="{Binding str}"></ctrls:RadarDataGrid>
</Grid>

私のウィンドウコードビハインドは次のとおりです

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;

namespace RadarStudio
{
    /// <summary>
    /// Interaction logic for Users.xaml
    /// </summary>
    public partial class Users : Window
    {
        public Users()
        {
            InitializeComponent();
            //this.DataContext = this;

            str.Add("dhaval");
            str.Add("ravinder");
        }

        public ObservableCollection<string> str = new ObservableCollection<string>();
    }
}

私は非常に多くのことを試しましたが、グリッドで文字列を取得できません。

助けてください!前もって感謝します!

よろしく、

サマール

4

5 に答える 5

2

パブリック プロパティにのみバインドできます。プロパティstrとして作成します。

MSDNから:The properties you use as binding source properties for a binding must be public properties of your class. Explicitly defined interface properties cannot be accessed for binding purposes, nor can protected, private, internal, or virtual properties that have no base implementation.

You cannot bind to public fields.

于 2012-08-17T15:04:24.007 に答える
0

これを試して.....

サンプルデータを確認したところ、正常に機能しました。これ以上テストしません。

入念にチェック……。

私はあなたのコードを変更し、以下に投稿しました。

<UserControl x:Class="RadarControls.RadarDataGrid"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"  >
     <!--xmlns:local="clr-namespace:RadarControls"-->
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="25" />
        </Grid.RowDefinitions>

        <DataGrid Name="myGrid" Grid.ColumnSpan="3"  AutoGenerateColumns="True"></DataGrid> //Data Grid Is Modified

        <Button Content="Add" Grid.Row="1" Height="23" Margin="0,2,2,0" HorizontalAlignment="Left" Name="btnAdd" Width="100" />
        <Button Content="Delete" Grid.Column="1" Grid.Row="1" Margin="0,2,2,0" Height="23" HorizontalAlignment="Left" Name="btnDelete" Width="100" />
        <Button Content="Save" Grid.Column="2" Grid.Row="1" Height="23" Margin="0,2,0,0" HorizontalAlignment="Left" Name="btnSave" Width="100" />
    </Grid>
</UserControl>

このユーザーコントロールを使用することになっているウィンドウの xaml

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace RadarControls
{
    /// <summary>
    /// Interaction logic for RadarDataGrid.xaml
    /// </summary>
    public partial class RadarDataGrid : UserControl
    {
        public RadarDataGrid()
        {
            InitializeComponent();
        }

        public DataGrid RadarGrid//New Public Class is added
        {
            get { return myGrid; }
        }
    }
}

このユーザーコントロールを使用するウィンドウの xaml

<Window x:Class="RadarStudio.Users"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Users" Height="300" Width="300">
    <Grid >
        <!--xmlns:ctrls="clr-namespace:RadarControls;assembly=RadarControls"
        xmlns:vm='clr-namespace:RadarViewModel.Users;assembly=RadarViewModel'-->
        <Grid Name="Dggrid"> </Grid>//New Grid is added as a place holder
    </Grid>
</Window>

ウィンドウコードビハインドは次のとおりです

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using RadarControls;

namespace RadarStudio
{
    /// <summary>
    /// Interaction logic for Users.xaml
    /// </summary>
    public partial class Users : Window
    {
        RadarDataGrid rg = new RadarDataGrid();//Object of user control
        List<UserList> List = new List<UserList>();// It will be your item source
        UserList ListItem;
        public Users()
        {
            InitializeComponent();
            //this.DataContext = this;
            ListItem = new UserList();
            ListItem.UserName = "dhaval";//Adding First Item
            List.Add(ListItem);
            ListItem = new UserList();
            ListItem.UserName = "ravinder";//Adding Second
            List.Add(ListItem);
            rg.RadarGrid.ItemsSource = List;//Assigned Itemsource

            Dggrid.Children.Add(rg);
        }
    }

/*This Class is need to store user information, you can include users additional details 
(if needed) by creating corresponding Properties*/
    public class UserList
    {
        string userName;

        public string UserName
        {
            get { return userName; }
            set { userName = value; }
        }
    }
}
于 2012-08-22T06:58:14.560 に答える
0

Zabavsky が述べたように、WPF バインドはオブジェクトのプロパティで機能しますが、フィールドでは機能しません。

str をプロパティに変更してみてください:

public partial class Users : Window
{
    public Users()
    {
        InitializeComponent();
        this.DataContext = this;

        str = = new ObservableCollection<string>();
        str.Add("dhaval");
        str.Add("ravinder");
    }

    public ObservableCollection<string> str { get; set; }

}
于 2012-08-21T06:55:59.563 に答える
0

ウィンドウには Datacontext がなく、バインドしているときに str が見つかりません。xaml を変更します。

<Window x:Class="RadarStudio.Users"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ctrls="clr-namespace:RadarControls;assembly=RadarControls"
xmlns:vm='clr-namespace:RadarViewModel.Users;assembly=RadarViewModel'
Title="Users" Height="300" Width="300"
Name="root">

<Grid >
    <ctrls:RadarDataGrid Name="grid1" DataContext="{Binding Path=str, ElementName=root}"/>
</Grid> </Window>

そしてstrをプロパティとして設定します

public partial class Users : Window
{
    public Users()
    {
        str = new ObservableCollection<string>();
        InitializeComponent();
        //this.DataContext = this;

        str.Add("dhaval");
        str.Add("ravinder");
    }

    public ObservableCollection<string> str { get; set; }
}
于 2012-08-24T09:33:10.560 に答える
-1

これはばかげた間違いのようですが、InitializeComponent呼び出しの前に監視可能なコレクションを初期化すると、データが表示され始めました。

于 2012-08-21T07:51:32.673 に答える