0

すでに2つのユーザーコントロールを作成しました。1つをマスターユーザーコントロールとして使用し、もう1つを詳細ユーザーコントロールとして次のように使用します。

1 Parent Control
  1.1 - User Control 1 as Master Control
  1.2 - User Control 2 as Details Control

マスターコントロールには、アイテムの名前を選択するリストボックスがあり、詳細コントロールには、在庫のあるすべての利用可能なアイテムが表示されます。親コントロールにItemIdを追加し、それをマスターコントロールと詳細コントロールにバインドしました(両方のコントロールのDPとしてItemIdがあります)。マスターからアイテムを選択すると、詳細グリッドが更新されません。

マスターユーザーコントロールからアイテムを選択するときに、どうすれば確認できますか。詳細ユーザーコントロールに詳細が表示されますか?

親コントロール

 <Grid>
        <StackPanel Orientation="Horizontal"
                    Width="650"
                    HorizontalAlignment="Left"
                    Margin="10,10,0,0">
             <UC:ItemDetailUC ItemId="{Binding ElementName=MainWindowName,Path=ItemId,Mode=TwoWay}" />
             <UC:StockItemDetailsUC ItemId="{Binding ElementName=MainWindowName,Path=ItemId,Mode=TwoWay}"/>
        </StackPanel>
    </Grid>

public partial class MainWindow : Window, INotifyPropertyChanged
        {

       private int _ItemId;
            public int ItemId
            {
                get
                {
                    return _ItemId;
                }
                set
                {
                    if (_ItemId == value)
                        return;
                    _ItemId = value;
                    OnPropertyChanged("ItemId");
                }
            }

            public MainWindow()
            {
                InitializeComponent();            
                this.DataContext = this;
            }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    }

1.1-マスターコントロールとしてのユーザーコントロール1-ItemDetailUC.XAML

    <UserControl x:Class="LearnWPF.ItemDetailUC"
             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" 
             mc:Ignorable="d" 
             Name="ItemDetailUCName"
             d:DesignHeight="100" d:DesignWidth="350">
    <Grid Background="Aqua">
        <StackPanel Orientation="Vertical" Margin="10,10,0,0" >
            <Label Content="Master Control:" Width="350" HorizontalContentAlignment="Center"/>
            <StackPanel Orientation="Horizontal" Width="200" HorizontalAlignment="Left" Margin="10,10,0,0">
                <Label Content="Item :" Width="80"/>
                <ComboBox Name="ItemListComboBox" Width="100"
                          DisplayMemberPath="ItemName"
                          SelectedValuePath="ItemId"
                          SelectedValue="{Binding ElementName=ItemDetailUCName, Path=ItemId}" />
            </StackPanel>
            <StackPanel Orientation="Horizontal" Margin="10,10,0,0">
                <Label Content="Available Qty :" Width="80"/>
                <TextBox Width="100" Text="{Binding ElementName=ItemListComboBox, Path=SelectedItem.AvailableQty}" />
                 <Label Content="MaxQty :" Width="60"/>
                <TextBox Width="80" Text="{Binding ElementName=ItemListComboBox, Path=SelectedItem.MaxQty}" />
           </StackPanel>
        </StackPanel>
    </Grid>
</UserControl>

    public static readonly DependencyProperty ItemIdProperty = DependencyProperty.Register("ItemId", typeof(int), typeof(ItemDetailUC));
 public int ItemId
    {
        get
        {
            return (int)GetValue(ItemIdProperty);
        }
        set
        {
            SetValue(ItemIdProperty, value);
        }
    }


       public ItemDetailUC()
    {
        InitializeComponent();
        ItemListComboBox.ItemsSource = Data.GetItemList();
        this.DataContext = this;
    }

1.2-詳細コントロールとしてのユーザーコントロール2

<UserControl x:Class="LearnWPF.StockItemDetailsUC"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="200" d:DesignWidth="300">
    <Grid>

        <StackPanel Orientation="Vertical" Background="Aquamarine">
             <Label Content="Details Control:" Width="300" HorizontalContentAlignment="Center"/>

        <DataGrid Name="StockItemDetailsDataGrid" Background="Aquamarine"
                  AutoGenerateColumns="False">

             <DataGrid.Columns>
                <DataGridTextColumn Header="Location Name"  Binding="{Binding LocationName}"/>
                <DataGridTextColumn Header="RowNo" Binding="{Binding RowNo}" />
                 <DataGridTextColumn Header="ColumnNo" Binding="{Binding ColumnNo}" />
                 <DataGridTextColumn Header="Qty" Binding="{Binding Qty}" />               
            </DataGrid.Columns>


        </DataGrid>
</StackPanel>
    </Grid>
</UserControl>

        public static readonly DependencyProperty ItemIdProperty = DependencyProperty.Register("ItemId", typeof(int), typeof(StockItemDetailsUC));

        public int ItemId
        {
            get
            {
                return (int)GetValue(ItemIdProperty);
            }
            set
            {
                SetValue(ItemIdProperty, value);
            }
        }


        public StockItemDetailsUC()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(StockItemDetailsUC_Loaded);

        }

        void StockItemDetailsUC_Loaded(object sender, RoutedEventArgs e)
        {
            if (ItemId != 0)
            {
                StockItemDetailsDataGrid.ItemsSource = Data.GetItemLocaitonDetails(ItemId);
            }
            this.DataContext = this; 
        }
.

       public class ItemDetailsVO: INotifyPropertyChanged
    {
        private int _ItemId;
        public int ItemId
        {
            get
            {
                return _ItemId;
            }
            set
            {
                if (_ItemId == value)
                    return;
                _ItemId = value;
                OnPropertyChanged("ItemId");
            }
        }

        private String _ItemName;
         private int _AvailableQty;
         private int _MaxQty;
    }





   public class StockItemDetails : INotifyPropertyChanged
    {
        private int _ItemId;
        public int ItemId
        {
            get
            {
                return _ItemId;
            }
            set
            {
                if (_ItemId == value)
                    return;
                _ItemId = value;
                OnPropertyChanged("ItemId");
            }
        }

        private String _LocationName;
        private int _Qty;
        private int _RowNo;
        private int _ColumnNo;
        /..... all properties are implemented
    }
4

1 に答える 1

0

ItemIDだけを依存関係プロパティとして使用するのではなく、アイテム自体を使用してください。次のシナリオは、要件を満たす必要があります。

CItemがマスター/詳細ビューの1つのレコードのタイプであると想定します。マスターコントロールと詳細コントロールをホストするビューで、を公開するビューモデルを使用するか、マスターリストのバインディングターゲットとして設定したList<CItem>アイテムを動的に追加/削除する場合はを使用します。さらに、ビューモデルにタイプCItemの依存関係プロパティ「SelectedObject」を作成します。SelectedItemのマスターリストで、その「SelectedObject」プロパティへの双方向バインディングを作成します。詳細ビューでは、「SelectedObject」のプロパティにもバインドします。ObservableCollection<CItem>ItemsSource

<TextBox Text="{Binding SelectedObject.MyProperty, Mode=TwoWay}" />

これで、マスタービューのユーザーが別のレコードを選択すると、SelectedObjectプロパティが更新され、そのため、そのレコードのすべての詳細バインディングも更新されます。

編集:したがって、追加のロジックが必要な場合は、依存関係プロパティItemIDの値が変更されたときにコールバック関数を使用することを検討してください。依存関係プロパティを登録するときは、PropertyChangedCallbackコンストラクターでPropertyMetadataを使用します。依存関係プロパティの値が変更されるたびに、コールバック関数が呼び出されます。このコールバック関数では、詳細ビューのアイテムをロード/準備するために言及した追加のロジックをトリガーできます。

于 2012-06-23T09:25:37.963 に答える