2016-12-13 12 views
0

を動作しません。私はこのようにそれをバインドしたいときには:のDataContext親のへの結合カスタムコントロールのDataContextは、私はこのような正常に動作<strong>カスタムコントローラ</strong>を持って

<ScrollViewer DataContext="{Binding SHVM.Selected}"> 
    <Controller:DLBox ID="{Binding ID}" /> 
</ScrollViewer> 

、それはまったく動作しません。私は他のいくつかを持っていますカスタムコントローラーと彼らはうまくやっていますが、私は地獄がこの1つの問題であるか分からない!

これはコントローラです:

public partial class DLBox : UserControl 
{ 
    public static DependencyProperty IDProperty = 
     DependencyProperty.Register("ID", typeof(int), typeof(DLBox), 
      new FrameworkPropertyMetadata(0,FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
       (o, e) => (o as DLBox).IDPropertyChanged((int)e.NewValue))); 
    public int ID { get; set; } 

    private void IDPropertyChanged(int e) 
    { 
     ID = e; 
    } 
} 

誰かが私が間違っ何を教えていただけますか?私は6時間連続してデバッグしているので、何も見つかりませんでした!どうもありがとう。

UPDATE: 追加するだけで働いていた:

<... DataContext={Binding} .../> 

そして、私は理由を知りません!
実際の問題は、私が内部でこれを使用したいということです。ItemsControlsでも、DataContextはまだ動作しません。
(ただ、明確化のために、私は10校最初のリストのような最初のものについて考えてみて。お互いの内側2つのリストを持っており、各学校内でいくつかのstudens 第二のリストがある)

<ItemsControl ItemsSource="{Binding Source={StaticResource Locator}, Path=SHVM.Extra.Items}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <ItemsControl DataContext="{Binding}" ItemsSource="{Binding Items}"> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <Controller:DLBox DataContext="{Binding}" ID="{Binding ID}" /> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </DataTemplate> 
    <ItemsControl.ItemTemplate> 
</ItemsControl> 

更新2: IDはTextBlockで、UserControlです。私がここに示すことは何もありません!
ちょうど(私のコントローラ内でMVVMを使用していない)PropertyCallBack内TextBlockテキストを設定し、私が行ったすべての、:

<TextBlock x:Name="txtIDValue"/> 

そして、分離コード内部:

private void IDPropertyChanged(string e) 
{ 
    ID= e; 
    txtIDValue.Text = e; 
} 

関連するものは何もありませんこの問題に、それが私がそれを理解できなかった理由です!
ありがとうございます。

回答: それに取り組んだ12時間後、私は愚かな間違いでした!なぜ私がコントローラーにDataContextを設定したのか分かりませんXAML!とにかく、ありがとう。

+1

をする場合には、 'o'ではないので、あなたは、'(DLBoxとしてO).IDPropertyChanged(...) 'のような何かを行うべきではありません'DLBox'では、' InvalidCastException'をエクスクルードする間、間違って 'NullReferenceException'を投げます。式は代わりに '((DLBox)o).IDPropertyChanged(...)'でなければなりません。とにかく、それはまったく必要ありません。 – Clemens

+1

あなたのDataContextを明示的に設定する、 'DLBox'には何かがありますか? 'DataContext = this;'コンストラクタでは? – Clemens

+0

@クレメンスノープ!私もそれを設定する必要がありますか?私はそれについて知らなかった。 **編集:**それは動作しませんが! – Mostafa

答えて

2

CLRラッパーのゲッターとセッターがそれぞれGetValueSetValueメソッドを呼び出す必要があるため、依存関係プロパティの宣言が間違っています。それに加えて、PropertyChangedCallbackは冗長です。プロパティ値が設定されたばかりのコールバックでプロパティを再度設定する必要はありません。

宣言は次のようになります。注意点としては

public static readonly DependencyProperty IDProperty = DependencyProperty.Register(
    "ID", typeof(int), typeof(DLBox), 
    new FrameworkPropertyMetadata(
     0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

public int ID 
{ 
    get { return (int)GetValue(IDProperty); } 
    set { SetValue(IDProperty, value); } 
} 
+0

まだ動作しません!また、私はこの解決策を以前に使っていましたが、もう一度やり直しました。私は自分の方法が冗長であることを知っていますが、私はそれをそのまま使用しなければなりません。 – Mostafa

関連する問題