2 回答

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個贊
要在 DataTemplate 中使用 x:Bind,您必須在 DataTemplate 中指定 x:DataType="local:Movie"。模板中 x:Bind 中的路徑應(yīng)與 Movie 對象相關(guān)。
“未設(shè)置對象引用”僅表示您尚未分配指針。也許 ViewModel 為 null 或 ViewModel.UpdateStuff 為 null。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個贊
我現(xiàn)在嘗試通過一個小例子向您展示一個解決方案。你會看到有些事情發(fā)生了變化。我希望它仍然能滿足您的需要:
<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);
}
}
}
你看我簡化了一點(diǎn)(沒有轉(zhuǎn)換器等)?!笆录币脖灰苿拥揭晥D模型。對我來說,優(yōu)點(diǎn)是,它現(xiàn)在不依賴于視圖來調(diào)用事件,它只是對視圖模型很重要。因此,如果您制作不同的視圖來顯示媒體,它仍然可以正常工作。
我也遠(yuǎn)離了“雙向”的東西,因?yàn)槟壳皼]有必要從視圖模型發(fā)送到視圖。如果需要,“媒體”將需要實(shí)施 INotifyPropertyChanged。
- 2 回答
- 0 關(guān)注
- 191 瀏覽
添加回答
舉報