0

私のプロジェクト コードには、TableControl と DeckControl の 2 つのカスタム UserControl があります。後者のコードでは、必要なときに前者にアクセスできます。したがって、私の DeckControl では、次のプロパティを実装しました。

private TableControl m_Table;

public TableControl Table
{
    get { return m_Table; }
    set { m_Table = value; }
}

問題は、XAML コードからプロパティを設定できないことです。

<Canvas Core:Name="Layout" Loaded="OnLayoutLoaded">
    <Namespace:TableControl Core:Name="Table" Canvas.Left="0" Canvas.Top="0" Height="{Binding ElementName=Layout, Path=ActualHeight}" Width="{Binding ElementName=Layout, Path=ActualWidth}"/>
    <Namespace:DeckControl Core:Name="Deck" Canvas.Left="50">
</Canvas>

Reference を使用してみましたが、コンパイラはメソッドまたはオペラと言っています

<Namespace:DeckControl Core:Name="Deck" Canvas.Left="50" Table="{Core:Reference Name=Table}">

私はこれを試しましたが、どちらも機能していません:

<Namespace:DeckControl Core:Name="Deck" Canvas.Left="50" Table="{Core:Static Table}">

私もバインディングを使ってみました:

<Namespace:DeckControl Core:Name="Deck" Canvas.Left="50" Table="{Binding ElementName=Table}">

わかりました...これは XAML への私の最初のアプローチであり、私はまだそれに取り組んでいます...しかし、私は本当にそれを得ることができません!

4

1 に答える 1

1

モデル(ウィンドウ/ユーザーコントロール)コードビハインドのプロパティにバインドする場合は、を設定する必要がありDataContextますXaml。これを行う方法はいくつかありますが、最も簡単なのは、ウィンドウまたはユーザーコントロールに名前を付け、を使用してバインドすることElementNameです。

ウィンドウの例:

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="233" Width="143" Name="UI">

    <Canvas DataContext="{Binding ElementName=UI}" > <!-- Set dataContext to Window -->
        <Namespace:DeckControl Canvas.Left="50" Table="{Binding ElementName=Table}">
    </Canvas>
</Window>

また、Xamlテーブルが変更されたときに更新する場合は、コードビハインドで実装する必要があります。これにより、プロパティが変更されたことINotifyPropertyChangedが通知されます。Xaml

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private TableControl m_Table;

    public TableControl Table
    {
       get { return m_Table; }
       set { m_Table = value; NotifyPropertyChanged("Table"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

TableプロパティがDependancyPropertyでない場合は、バインドできるようにこれを変更する必要があります。

例:

public class DeckControl : UserControl
 {
     .......



     // Using a DependencyProperty as the backing store for Table.  This enables animation, styling, binding, etc...
     public static readonly DependencyProperty TableProperty =
         DependencyProperty.Register("Table", typeof(TableControl), typeof(DeckControl), new UIPropertyMetadata(null));

     public TableControl Table
     {
         get { return (TableControl)GetValue(TableProperty); }
         set { SetValue(TableProperty, value); }
     }
 }

また、UserControlのスコープ外でバインドされているプロパティは、DependancyPropertyである必要があります。

例:

public partial class DeckControl : UserControl
{
    public DeckControl()
    {
        InitializeComponent();
    }

    private int myVar;
    public int MyProperty
    {
        get { return myVar; }
        set { myVar = value; }
    }
}

これは、スコープ内にある単純なプロパティである場合、ユーザーコントロール内にバインドされます。

<UserControl .....
             d:DesignHeight="300" d:DesignWidth="300" Name="UI">

    <TextBlock Text="{Binding MyProperty}" />
</UserControl>

これはUserControlの範囲外であるためバインドされません。ここでバインドするには、MyPropertyがDependancyPropertyである必要があります。

<Window ....
        Title="MainWindow" Height="233" Width="143" Name="UI">

    <Grid>
        <local:DeckControl MyProperty="{Binding Width}"  /> // Will not bind
    </Grid>

</Window>

それが理にかなっていることを願っています:)

于 2013-01-27T21:05:02.717 に答える