1

モデルをXamlコードにバインドしていますが、プロパティにバインドする方法について質問があります。

私のビューモデルが次のようになっていると仮定しましょう

internal class LogsVM
{
    private List<Log> logList;
    public List<Log> LogList
    {
        get; set;
    }       

    public LogsVM()
    {

    }

    public LogsVM(List<Logging.Log> logs)
    {
        logList = logs;
    }
}

Logクラスが次のようになっていると仮定します

internal class Log
{
    public string Title { get;set; }
    public List<MoreDetails> moreDetails;

    public Log()
    {
        moreDetails= new List<MoreDetails>();
    }
}

Xamlで、TreeView内のタイトルにバインドするにはどうすればよいですか?

これまでの私のXamlは次のようになります

<Window x:Class="BackUps.Logging.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:myData ="clr-namespace:BackUps.Logging.ViewModel"
        Title="Logging Results" Height="350" Width="525">

    <Grid>
        <Grid.Resources>
            <myData:LogsVM x:Key="Vm" />
        </Grid.Resources>
        <Grid.DataContext>
            <Binding Source="{StaticResource Vm}"></Binding>
        </Grid.DataContext>
        <TreeView>
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate DataType="{x:Type myData:LogsVM}" ItemsSource="{Binding LogList}">
                    <TextBlock Text="{Binding Title}" />
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate DataType="{x:Type myData:LogsVM}">
                            <TextBlock Text="{Binding moreDetails.Staus}" />
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </Grid>
</Window>

そして私のMainWindowコードは背後にあります

public MainWindow(List<Log> logs)
    {
        InitializeComponent();
        LogsVM logVm = new LogsVM(logs);
        this.DataContext = logVm;
    }

上記のコードでわかるように、Titleプロパティをバインドしようとしていますが、画面にテキストがまったく表示されません。

だから、私の2つの質問は次のとおりです。

  1. ViewModelクラスを単独で使用するだけで十分ですか、それともXamlにViewModelの各内部クラス(この場合はLogクラス)を通知する必要がありますか?例えば

    xmlns:myData = "clr-namespace:BackUps.Logging.ViewModel"
    xmlns:moreData = "clr-namespace:BackUps.Logging.Logs"

  2. タイトルをバインドするには何をする必要がありますか?

4

1 に答える 1

2

Bindingあなたが思うかもしれないように複雑ではありません、あなたはただTreeviewHierarchicalDataTemplateものを習得してプロパティを公開していないだけです、XAMLあなたのすべてのドメインクラスをパブリックに設定してください。それらはパブリックプロパティで使用されます。myDataはドメインクラスの名前空間を参照する必要があります。例:私の場合、クラスxmlns:myData="clr-namespace:WpfApplication3" MoreDetailsのパブリックプロパティである必要がありますLog

   <TreeView ItemsSource="{Binding LogList}" >
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate DataType="{x:Type myData:Log}" ItemsSource="{Binding MoreDetails}">
                <TextBlock Text="{Binding Title}" />
                <HierarchicalDataTemplate.ItemTemplate >
                    <DataTemplate DataType="{x:Type myData:MoreDetails}" >
                        <TextBlock Text="{Binding Status}" />
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>



public class Log
    {
        public string Title { get; set; }
        public List<MoreDetails> MoreDetails { get; set; }

        public Log()
        {
            MoreDetails = new List<MoreDetails>();
        }
    }

    public class MoreDetails
    {
        public string Status { get; set; }
    }

public class YourVM
{
     public YourVM() // in my case i've just run it fast in code behind 
            {
                LogList = new List<Log>
                    {
                        new Log{Title = "Hichem", MoreDetails = new List<MoreDetails>{ new MoreDetails{Status = "OK"}}},
                        new Log{Title = "Hichem"},
                        new Log{Title = "Hichem"},
                        new Log{Title = "Hichem"},
                    };

            }


            public List<Log> LogList { get; set; }
}
于 2013-01-28T12:50:47.283 に答える