2017-01-30 2 views
0

wpfの新機能です。リストボックスを作成して動的リストアイテムを作成しました。ここでは、2つのテキストブロックである2つのコントロールを含むdatetemplateを使用しました。値はコンボボックス(文字列データ型)を形成し、もう1つはコードバインドから値をバインドします。このクラスのwpfのデータ型コントロールへの値をバインドする

XAML

<ListBox ItemsSource="{Binding obj}" HorizontalContentAlignment="Left" x:Name="lstbxindex" SelectionMode="Extended" Foreground="White" FontSize="20px" Height="201" BorderBrush="#555555" Margin="80,40,0,0" VerticalAlignment="Top" Width="282" Background="#555555" > 
    <ListBox.ItemTemplate> 
      <DataTemplate> 
      <StackPanel Orientation="Horizontal" Margin="5" > 
       <TextBlock Height="40px" Width="80px" Text="{Binding roundedhourvalue, FontSize="24" Background="#555555" Foreground="White"></TextBlock> 
       <TextBlock x:Name="items" Text="{Binding}" Margin="35,0,0,0"></TextBlock> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

C#(Roundedhour.cs)

public class Roundedhour 
{ 
    public string hourvalue { get; set; } 

    public override string ToString() 
    { 
     return string.Format("{0}", hourvalue); 
    } 
} 

hourvalueのプロパティを作成します。このクラスでは、コードビハインドファイルにオブジェクトを作成しました。このオブジェクトは、次のように記述しました。オブジェクトを作成し、hourvalue変数の値を割り当てます。ここ

C#(コードビハインド)

{ 
    if (dispatcherTimer1.Interval == TimeSpan.FromSeconds(15)) 
    { 
     //lstbxindex.Items.Add(lstbxindex.SelectedItem.ToString()); 

     string hrvalue = Convert.ToString(hrvalueinitially); 

     obj = new Roundedhour(); 
     obj.hourvalue = Convert.ToString(hrvalueinitially); 

     string roundedhourvalue =obj.hourvalue; 

     this.DataContext = this; 


     //lblprojectAhr.Content = string.Join(",", hrvalueinitially + "" + "hr"); 
    } 
} 

、Iはそのプロパティ時間値にRounderhour class.Assign値のオブジェクトを作成しました。しかし、コードバインドからXAMLページに値をバインドすることはできません。

+0

あなたの 'DataContext'は' {get;}を含む 'public'プロパティを持つ必要があります。 }(getter) 'を呼び出して、あなたの' Binding'から値を取り出します。また、 'Roundedhour'のプロパティは' roundedhourvalue'ではなく 'timevalue'と呼ばれます。 **バインディングの問題がある場合、VisualStudioの 'Output'-Windowを常にチェックしてください。** - そこには何が欠落しているかがわかります。 –

答えて

-1

XAMLオブジェクトの "ItemsSource"プロパティにバインディング変数を割り当てます。

ここ
List<yourobject> bindingObjectList = new List<yourobject>(); 
// insert your objects into the list 
this.ItemsSource = bindingObjectList; 

あなたが例を見つけることができます:

また、それは完全に間違って結合オブジェクトの自体、オブジェクトのプロパティに

this.DataTemplate = this; 

のような使用だ

Grid & Pivot Binding Example for multiple DataTemplates

+0

this.ItemsSource = obj; this.ItemsSourceの値を取得しますが、ラベルにバインドされていない値 – user688

+0

"Listbox"を使用し、コードビハインドに割り当てる必要があるItemsSourceプロパティがあり、これをコードサンプル内で完了できませんでした。 itemssourceにCollection(List、Ienumerableなど)を割り当てる必要があります。だからあなたはまだあなたの見解に何かを縛らなかった。 –

1

あなたItemsSourceべきになる。

ListBox ItemsSource="{Binding obj}" 

また、変数とプロパティに意味のある名前を付けるようにしてください。これにより、後でコードを読むことが容易になります。 n。

2番目の問題は、お客様自身のBindingにあります。

あなたはこのように結合されています。だから、WPFはobjのプロパティroundedhourvalueを期待しているText="{Binding roundedhourvalue}

しかし、CodeBehindに示されているように、obj.hourvalueしかありません。

だからText="{Binding hourvalue}

にあなたのバインディングを変更する詳細については、お使いのOutput-Windowを確認してください。

注:

string roundedhourvalue = obj.hourvalue; 

にはgetterを持っていないし、そのprivate以来accsessibleではありません。

NOTE:あなたはBindingORあなたのセット分離コード内のItemsSourceを使用しますか。


このようにそれを試してみてください。

ただ、すべての書式とか削除:

<ListBox ItemsSource="{Binding RoundedHours}" x:Name="ListBox"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal" Margin="5" > 
       <TextBlock Text="{Binding hourvalue}"></TextBlock>     
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

を、これにあなたのコードビハインド変更:

private void UpdateDataContext(object hrvalueinitially) 
    { 
     List<Roundedhour> hours = new List<Roundedhour>(); 
     hours.Add(new Roundedhour() 
     { 
      hourvalue = hrvalueinitially.ToString() 
     }); 

     //Set the ItemsSource in code: => remove your ItemsSource Binding from XAML 
     listBox.ItemsSource = hours; 
    } 

たり、缶「MVVM」アプローチを使用してください:

public class MyViewModel : INotifyPropertyChanged 
    { 
     //IMPLEMENT INotifyPropertyChanged HERE PLS 

     public ObservableCollection<RoundedHour> Collection { get; set; } = new ObservableCollection<RoundedHour>(); 

     private void AddToCollection(object hrvalueinitially) 
     { 
      Collection.Add(new RoundedHour() 
      { 
       hourvalue = hrvalueinitially.ToString() 
      }); 
      OnPropertyChanged("Collection"); 
     } 

     //Make sure to set your Windows DataContext to an Instance of this Class 
    } 
+0

Text = {Binding hourvalue}を変更しましたが、ラベルにバインディングされていない値を変更しました。 – user688

+0

[MVVM](https://msdn.microsoft.com/en-us/library/hh848246.aspx) –

+0

System.Windows.Dataエラー:40:BindingExpressionパスエラー: 'obj'プロパティが見つかりません'オブジェクト' ''文字列 '(HashCode = -2067273858)'に設定します。 BindingExpression:Path = obj; DataItem = '文字列'(HashCode = -2067273858);ターゲット要素は 'Label'(Name = '')です。 targetプロパティは 'Content'(タイプ 'Object')です – user688

関連する問題