2 回答
TA贡献1801条经验 获得超8个赞
要在 DataTemplate 中使用 x:Bind,您必须在 DataTemplate 中指定 x:DataType="local:Movie"。模板中 x:Bind 中的路径应与 Movie 对象相关。
“未设置对象引用”仅表示您尚未分配指针。也许 ViewModel 为 null 或 ViewModel.UpdateStuff 为 null。
TA贡献1802条经验 获得超5个赞
我现在尝试通过一个小例子向您展示一个解决方案。你会看到有些事情发生了变化。我希望它仍然能满足您的需要:
<ListView ItemsSource="{Binding MovieLibrary}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<ComboBox ItemsSource="{Binding Episodes}"
SelectedItem="{Binding Progress}" >
</ComboBox>
<TextBlock Text="{Binding Title}" TextWrapping="Wrap" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
这是一个示例视图模型:
public class MainWindowModel
{
public MainWindowModel()
{
MovieLibrary = new ObservableCollection<Media>();
//
//Exmaple Fill
//
var m1 = new Media() { Title = "Breaking Bad", Episodes = new List<string> { "1", "2", "3", "4", "5", "6" } };
var m2 = new Media() { Title = "The Big Bang Theory", Episodes = new List<string> { "1", "2", "3" } };
m1.MediaChangedAction += OnMediaChanged;
m2.MediaChangedAction += OnMediaChanged;
MovieLibrary.Add(m1);
MovieLibrary.Add(m2);
}
public ObservableCollection<Media> MovieLibrary { get; set; }
private void OnMediaChanged(Media movie)
{
// do something
}
}
public class Media
{
public event Action<Media> MediaChangedAction;
public Media()
{
}
public string Title { get; set; }
public List<string> Episodes { get; set; }
private string _progress;
public string Progress
{
get { return _progress; }
set
{
_progress = value;
MediaChangedAction?.Invoke(this);
}
}
}
你看我简化了一点(没有转换器等)。“事件”也被移动到视图模型。对我来说,优点是,它现在不依赖于视图来调用事件,它只是对视图模型很重要。因此,如果您制作不同的视图来显示媒体,它仍然可以正常工作。
我也远离了“双向”的东西,因为目前没有必要从视图模型发送到视图。如果需要,“媒体”将需要实施 INotifyPropertyChanged。
- 2 回答
- 0 关注
- 131 浏览
添加回答
举报