2015-05-06 87 views
0

目前我試圖實現一個綁定到數據模板(WPF-MVVM)的可觀察集合。在初始化期間,它將默認值加載到可觀察集合中。思想是:綁定可觀察的集合更新沒有'RemoveOf'和'插入'

  1. 用戶提供的文本框中某個值,
  2. 按ENTER鍵
  3. 遞增計數器和位於附近的文本框中輸入文本塊更新的計數值。

目的是跟蹤用戶更改文本值的次數。

現在它正在使用'IndexOf','RemoveAt'和'Insert'。有沒有'刪除'和'插入'的方法。

我覺得我的代碼有問題嗎?任何人都可以幫助它。

InputDataTemplate.xaml:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="2*" /> 
     <ColumnDefinition Width="2*" /> 
     <ColumnDefinition Width="1*" /> 
    </Grid.ColumnDefinitions> 

    <Label Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" Content="{Binding Name}" /> 
    <Label Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center" Content="{Binding Count}" /> 
    <TextBox x:Name="IpDataTb" Grid.Column="1" Width="60" HorizontalAlignment="Center" VerticalAlignment="Center" DataContext="{Binding}" Text="{Binding Path=Data, Mode=TwoWay}"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="KeyDown"> 
       <ei:CallMethodAction TargetObject="{Binding }" MethodName="IpDataTrig" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </TextBox> 
</Grid> 

TestView.xaml:

<UserControl.Resources> 
    <DataTemplate x:Key="InputDataTemplate" > 
     <local:InputDataTemplate DataContext="{Binding}" /> 
    </DataTemplate> 
</UserControl.Resources> 
<Grid> 
    <Border BorderBrush="#FF0254B4" BorderThickness="1" > 
     <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" > 
      <ItemsControl ItemsSource="{Binding InputDatas}" 
          ItemTemplate="{DynamicResource InputDataTemplate}" /> 
     </ScrollViewer> 
    </Border> 
</Grid> 

DataService.cs:

using MyObsrCollTest.ViewModels; 

namespace MyObsrCollTest.Services 
{ 
    public class InputDataService : BindableBase 
    { 

     public string Name { get; set; } 
     public string Count { get; set; } 
     public string Data { get; set; } 

     public void IpDataTrig(object sender,KeyEventArgs e) 
     { 
      var IpDataTb = new TextBox(); 
      IpDataTb = (TextBox)sender; 

      if ((e.Key == Key.Enter) &&(!string.IsNullOrWhiteSpace(IpDataTb.Text))) 
      { 
       this.Data = IpDataTb.Text; 
       ObsrCollTestVm.TestMe(this.Name, this.Data); 
      } 
     } 
    } 
} 

個ObsrCollTestVm.cs:

private ObservableCollection<InputDataService> _InputDatas; 
static int _count = 0; 

public ObsrCollTestVm(void) 
{ 

    for (int i = 0; i < 5; i++) 
    { 

     var l_InputDatas = new InputDataService(); 
     l_InputDatas.Name = i.ToString(); 
     l_InputDatas.Count = "0"; 
     l_InputDatas.Data = "?"; 
     _InputDatas.Add(l_InputDatas); 
    } 
} 

基本初始化程序:

public ObservableCollection<InputDataService> InputDatas 
{ 
    get 
    { 
     if (_InputDatas == null) 
     { 
      _InputDatas = new ObservableCollection<InputDataService>(); 
     } 

     return _InputDatas; 
    } 
} 

新觀察到的集合:

public static void TestMe(string name, string data) 
{ 

    var found = _InputDatas.FirstOrDefault(element = > element.Name == name); 
    if (found != null) 
    { 
     int i = _InputDatas.IndexOf(found); 
     found.Count = _count++; 
     _InputDatas.RemoveAt(i); 
     _InputDatas.Insert(i, found); 
    } 
} 

遞增計數值:

回答

0

如果我理解正確的問題,它可以概括爲:

「我希望能夠改變我的InputDataService類對象的Count財產,有一個變化體現在該項目的Label,而不必修改ObservableCollection<InputDataService>本身。「

這是正確的嗎?

如果是這樣,那麼解決方案是爲您的InputDataService類正確提供屬性更改的通知。通常,這意味着要麼繼承DependencyObject,要麼將屬性實現爲依賴項屬性,要麼僅實現INotifyPropertyChanged接口。

但在你的例子中,你似乎已經繼承了名爲BindableBase的類。如果這個班級實際上是Microsoft.Practices.Prism.Mvvm.BindableBase班級,那麼它已經實施了INotifyPropertyChanged,你需要做的就是充分利用這一點。

例如:

public class InputDataService : BindableBase 
{ 
    private int _count; 

    public string Name { get; set; } 
    public int Count 
    { 
     get { return _count; } 
     set { SetProperty(ref _count, value); } 
    } 
    public string Data { get; set; } 

    public void IpDataTrig(object sender,KeyEventArgs e) 
    { 
     var IpDataTb = new TextBox(); 
     IpDataTb = (TextBox)sender; 

     if ((e.Key == Key.Enter) &&(!string.IsNullOrWhiteSpace(IpDataTb.Text))) 
     { 
      this.Data = IpDataTb.Text; 
      ObsrCollTestVm.TestMe(this.Name, this.Data); 
     } 
    } 
} 

注:

  • 在上文中,我只固定爲Count屬性的問題。您可以對其他屬性應用類似的更改以使其正確更新。
  • 在您的TestMe()方法中,您似乎將Count財產用作int,但它在您的代碼示例中聲明爲string。由於缺乏更好的方法來協調代碼示例中的差異,我剛剛在上面的示例中更改了屬性聲明,以使用int而不是string
  • 本示例假定您使用.NET 4.5,其中[CallerMemberName]屬性受支持。如果您使用.NET的早期版本,則需要將該屬性名稱添加到SetProperty()調用中。例如爲:
    SetProperty(ref _count, value, "Count");

有了這些變化,你應該能夠編寫TestMe()這樣的:

public static void TestMe(string name, string data) 
{ 
    var found = _InputDatas.FirstOrDefault(element = > element.Name == name); 
    if (found != null) 
    { 
     found.Count = _count++; 
    } 
} 
+0

非常感謝。它的工作現在完美。 – kar

+0

很高興聽到您能夠讓您的代碼正常工作。您可能有興趣閱讀關於Stack Overflow如何工作的更多信息:[當有人回答我的問題時,我該怎麼辦?](http://stackoverflow.com/help/someone-answers)。其他信息可以在此頁面的鏈接中找到:http://stackoverflow.com/help/asking –