2015-10-23 37 views
5

Uygulamamın bir MainWindow'u var. Bunun içinde, MainWindowViewModel'in bir özelliğine bağlanan 1 kontrol, ListBox vardır. Bu özellikBağımlılık özelliğine bir 'sınır' değeri nasıl iletilir?

CriteriaVm Kriterleri içinde MyString

adlı tek dize özelliği aşağıdaki kodu

<UserControl x:Class="CompoundInterests.View.CriteriaView" 
      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:vm="clr-namespace:CompoundInterests.ViewModel" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="600"> 

    <UserControl.Resources> 
     <ResourceDictionary Source="../Dictionary.xaml" /> 
    </UserControl.Resources> 
    <Grid> 
     <Border> 
      <Expander Header="{Binding MyString}" > 
       <vm:PropertiesVm ThresholdName="{Binding MyString}" /> 
      </Expander> 
     </Border> 
    </Grid> 
</UserControl> 

Gördüğünüz gibi var görüntüle vardır, ben bağlayıcı ediyorum tip CriteriaVm bir UserControl olduğunu MyString 2 yerde. Expander'da bağlanma gayet iyi çalışıyor, vm'deki özellikler: PropertiesVm (Bağımlılık Properitesini kullanıyor) değil. Aşağıdaki hata hata mesajı o ProperitesVm Stringim arıyor söylüyor

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=MyString; DataItem=null; target element is 'PropertiesVm' (HashCode=5991653); target property is 'ThresholdName' (type 'String')

Tamam ... Ben CriteriaVm Stringim arıyor olmalı Çıktı penceresinde gösterir. Bu, 1 seviye ve UserControl türünde olduğunu düşündüğüm RelativeSource'ı kullanmam gerektiği anlamına geliyor. Bu yüzden güncellendi: ben biraz farklı konuyu olsun ama aynı temel arıza anda

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.UserControl', AncestorLevel='1''. BindingExpression:Path=MyString; DataItem=null; target element is 'PropertiesVm' (HashCode=24649639); target property is 'ThresholdName' (type 'String')

varsa, PropertiesVm sadece bağımlılık özelliklere sahip olarak görünür

<vm:PropertiesVm ThresholdName="{Binding Path=MyString, RelativeSource={RelativeSource AncestorLevel=1,AncestorType=UserControl,Mode=FindAncestor}}" /> 

, PropertiesView adildir boş bir ızgara. Bu yüzden önce bu hata üzerinde çalışabilirim ve sonradan bağlanmanın sonraki aşamasını düşünebilirim.

Neden hata mesajı alıyorum veya yanlış yaptığımı göremiyorum. Gerektiğinde daha fazla kod sağlayabilirim. Bu aşamada proje çok erken, çok az kod.

+1

1.Add [BindableAttribute (true)] özelliğini senin örnekle kayboldum –

cevap

1

cevap mesajında ​​oldu! Benim UserControl DependencyObject değil bir UIElement değildi UserControl'ın miras çünkü anlaşılan kadarıyla

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=MyString; DataItem=null; target element is 'PropertiesVm' (HashCode=5991653); target property is 'ThresholdName' (type 'String')

... Bu nedenle

olduğunu, benim View codebehind, Bağımlılığı'nın Özellikler 'taşınmak zorunda olan İki yollu bağlamaya izin verdi ancak ViewModel'imin veri içeriğini ViewModel'de tuttu.

1

Böyle bakmak görünümü beklediğiniz:

<Style TargetType="{x:Type ns:YourViewModel}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ns:YourViewModel}"> 
       <Grid> 
        <TextBlock Text="{Binding ThresholdName, 
           RelativeSource={RelativeSource TemplatedParent}}"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

görmek model kodu çok fazla değişmeden olurdu sen gösterdiklerimizin:

public class YourViewModel: Control 
{ 
    public static readonly DependencyProperty ThreshNameProperty = DependencyProperty.Register("ThresholdName", typeof(string), typeof(PropertiesVm), new PropertyMetadata(string.Empty)); 

    public string ThresholdName 
    { 
     get { return GetValue(ThreshNameProperty).ToString(); } 
     set { SetValue(ThreshNameProperty, value); } 
    } 
} 

Tamamen değildi "MyStringValue" nin ne olduğunu anlatabilmek için MainWindow'un normal bir özelliği olmasını beklerdim. MainWindow bu "MyStringValue" özelliğine "ThresholdName" ayarı, sizin kontrolünüz örneğini oluşturacak:

<Grid> 
    <ns:YourViewModel ThresholdName="{Binding MyStringValue}"/> 
</Grid> 

Nihayet MainWindow kodu olacaktır:

public string MyStringValue { get; set; } 

public MainWindow() 
{ 
    InitializeComponent(); 
    DataContext = this; 
    MyStringValue = "dog"; 
} 
+1

ThresholdName için bağlıyor. Bu gol değil: S – MyDaftQuestions

+1

Ayrıca soruma MAJOR bir güncelleme yaptım – MyDaftQuestions

1

Mirasınızı, Bağımlılık Nesnesi'nden FrameworkElement öğesinden değiştirdiyseniz, bunun çalışması gerekir.

<vm:PropertiesVm DataContext="{Binding}" ThresholdName="{Binding MyString}" /> 

Neyse, Attached özelliğini denediniz mi?

Sanırım bu, benzer ya da böyle. aslında zaten orada ne overwritting, bir ControlTemplate kullanıyor -

https://social.msdn.microsoft.com/Forums/vstudio/en-US/aff23943-5483-40b2-816b-4ce687bc6bf8/systemwindowsdata-error-2-cannot-find-governing-frameworkelement?forum=wpf

İlgili konular