簡體   English   中英

Caliburn Micro Datagrid綁定

[英]Caliburn Micro Datagrid Binding

我在WPF應用程序中使用Caliburn Micro框架,並且需要將集合綁定到DatGrid的ItemsSource。 請考慮以下代碼:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ObservableCollection<Subject> Subjects;
}

public class Subject
{
    public string Title{ get; set; }
}

查看模型

public class PersonViewModel : Screen
{
    private Person _person;

    public Person Person
    {
        get { return _person; }
        set
        {
            _person = value;
            NotifyOfPropertyChange(() => Person);
            NotifyOfPropertyChange(() => CanSave);
        }
    }
    ....
}

視圖

<UserControl x:Class="CalCompose.ViewModels.PersonView" ...ommited... >
    <Grid Margin="0">
        <TextBox x:Name="Person_Id" HorizontalAlignment="Left" Height="23" Margin="10,52,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="Person_Name" HorizontalAlignment="Left" Height="23" Margin="10,90,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <DataGrid ItemsSource="{Binding Person_Subjects}" Margin="10,177,0,0"></DataGrid>     
    </Grid>
</UserControl>

問題1:當我運行應用程序時,TextBoxes獲得正確的值,但數據網格尚未填充。 在這里,我使用約定“ ClassName_PropertyName”的深度屬性綁定技術。

問題2當我更改“名稱”屬性的值時,永遠不會調用NotifyOfPropertyChange(()=> Person)。 當文本在“名稱”字段中更改時,我想調用Guard方法。

誰能建議我一個簡單的解決方案來克服這個問題? 提前致謝。

Person類上實現PropertyChangedBase ,然后對於Name我們可以編寫

private string name;
public string Name
{
    get { return name; }
    set
    {
        if (name == value)
            return;
        name = value;
        NotifyOfPropertyChange(() => Name);
    }
}

對於與DataGrid的綁定,請不要使用“深度綁定”,而只需使用

<DataGrid ItemsSource="{Binding Person.Subjects}" ...

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM