[英]Binding wont update
我有一个奇怪的问题,我在ListView的DataTemplate中的文本框不会更新其数据。 数据在我的属性“ LastValue”中设置,但从未返回。
这是我的ViewModel代码(仅此类的重要部分):
public interface ISignal : IValue, IChartItem, INotifyPropertyChanged
{
string SignalName { get; set; }
}
[Serializable]
public class Signal : ObservableObject, ISignal
{
public Signal()
: this(new ModelsDialogService())
{
LastValue = 0.0;
}
public Signal(IDialogService dialog)
{
dialogService = dialog;
VisibleInGraph = true;
RefreshRate = 1000;
Include = true;
Color = ColorList.FirstOrDefault();
LastValue = 0.0;
}
private readonly List<SignalValue> values = new List<SignalValue>();
[XmlIgnore]
public IEnumerable<SignalValue> Values
{
get
{
return values;
}
}
private double lastValue;
[XmlIgnore]
public double LastValue
{
get
{
return lastValue;
}
set
{
Set(ref lastValue, value);
//RaisePropertyChanged(() => LastValue);
}
}
public void AddValue(SignalValue val)
{
values.Add(val);
ValueAdded(this, new ValueAddedEventArgs(val));
LastValue = Convert.ToDouble(((XYValue)val).Value);
}
}
而我的XAML:
<ListView ItemsSource="{Binding SignalGroup.Signals}" SelectedValue="{Binding SelectedSignal}" FontWeight="Normal" BorderThickness="0" Foreground="white" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" DockPanel.Dock="Top" Background="#FF5B5A5A" Margin="10" >
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
Color="{StaticResource MetroBlueColor}"/>
</Style.Resources>
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu ItemsSource="{Binding CommandList}">
<ContextMenu.ItemTemplate >
<DataTemplate>
<MenuItem Header="{Binding DisplayName}" Command="{Binding ContextMenuCommand}" />
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</Setter.Value>
</Setter>
<Setter Property="HorizontalAlignment" Value="Stretch" />
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<DockPanel HorizontalAlignment="Stretch">
<TextBlock Text="{Binding SignalName}" DockPanel.Dock="Left" />
<TextBlock Text="{Binding LastValue}" TextAlignment="Right" Margin="10,0,10,0" DockPanel.Dock="Right"/>
</DockPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
感谢您的任何想法。
哦,我发现了一个有趣的事实。 绑定仅在反序列化之后才起作用。 当我创建新结构等时,它可以工作,但是当我使用XMLSerializer将该结构序列化为XML,然后反序列化此类中的每个绑定都行不通时,所以我可以更改所有值,但不能在GUI中更新它。
我已经实现了一个非常小的MVVM示例。
假设Signal
类仅具有要绑定到的两个属性。 然后, Signal
看起来非常干净和容易:
public class Signal
{
public string SignalName { get; set; }
public double LastValue { get; set; }
}
显然, Signal
是您的Model
!
现在,您需要在我的小型测试应用程序中使用名称为ViewModel
:
public class ViewModel
{
public ViewModel()
{
this.Signals = new ObservableCollection<Signal>();
this.Signals.Add(new Signal() { LastValue = 12432.33, SignalName = "First Signal"} );
this.Signals.Add(new Signal() { LastValue = 2.123, SignalName = "Second Signal"});
}
public ObservableCollection<Signal> Signals { get; set; }
}
ObservableCollection
就像一个列表,不同之处在于Collection更改时会通知View
。 集合会随着.Add(...)
和.Remove(...)
等操作而变化。
视图与您的视图相似。 我选择了GridView,因为它更方便,因为它支持元素的排序和编辑等功能:
<DataGrid ItemsSource="{Binding Signals}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="LastName" Binding="{Binding SignalName}" />
<DataGridTextColumn Header="LastName" Binding="{Binding LastValue}" />
</DataGrid.Columns>
</DataGrid>
使用GridView
时,可能需要将IsReadOnly
设置为True
。使用ListView
的解决方案应该看起来一样!
确保正确使用MVVM
模式。 该模型仅保存数据。 ViewModel适用于所有业务逻辑,而View仅显示数据。
我还建议创建一个文件夹结构,以便您对解决方案有更好的了解。 这也使遵循MVVM模式变得更加容易。
希望它能帮助和澄清MVVM
谢谢您的要求,它确实有用,但是我发现问题出在哪里。
我的应用程序中有两个集合。 我先添加Signals,然后当用户想要监视其中的一些信号时,选定的信号也会放入第二个集合(但仅作为参考)。 序列化从该结构创建XML,反序列化忽略引用,并在第一个和第二个集合中创建信号的新对象。 现在我们开始! :-D
发现这一点后,我感到非常愚蠢和愚蠢。 我必须重构它,直到我忘了它。 我花了很多时间来查找此错误的原因。
仍然感谢您的请求!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.