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);
}
}
}
你看我簡化了一點(沒有轉換器等)?!笆录币脖灰苿拥揭晥D模型。對我來說,優點是,它現在不依賴于視圖來調用事件,它只是對視圖模型很重要。因此,如果您制作不同的視圖來顯示媒體,它仍然可以正常工作。
我也遠離了“雙向”的東西,因為目前沒有必要從視圖模型發送到視圖。如果需要,“媒體”將需要實施 INotifyPropertyChanged。
- 2 回答
- 0 關注
- 189 瀏覽
添加回答
舉報