티스토리 뷰

반응형

이번 강좌는 글쓰기 기능을 구현하도록 하겠다. 강좌가 너무 늦어서 잊혀져 가는 강좌였을 것인데..흐흐;; 필자도 요즘 슬럼프끼가 좀 보여서 어떻게 해야하는지 나름 고민 중인데..이번 강좌에 만은 호응을 기대해 본다.(호응 없으면...더욱더 깊은 슬럼프의 나락으로 떨어질지도..쿨럭)
이번에도 이곳 저것 수정을 해 놔서..중요한 부분은 이곳에서 설명을 하고, 나머지는 소스를 참고 할 수 있도록 소스를 올리도록 하겠다.



1. BOARD_LIST.cs

제일 시간이 오래 걸렸던 부분인데.. Code First로 텍스트 필드를 만들어 놓으면 128Byte의 기본 크기를 가지게 되는데..우리가 글을 작성할때 128바이트는 너무나 작은 사이즈라..이걸 대폭~늘려야 한다. 특히 RichTextBox를 사용해서 xaml을 직접 입출력을 할려고 하면 무지막지하게 커야한다. 그래서 클래스를 고쳤다.

[Column(TypeName="ntext")]
[MaxLength]
public string LIST_CONTENT { get; set; }
이렇게 컬럼을 수정해 놓으면 무척 만은 데이터를 저장 할 수 있게 된다.(정확한 사이즈는 MSDN에서..쿨럭)

추가로 테이블 스키마가 수정되면 전에 우리가 만들어 놓았던 SL5_BOARD_DBCONTEXTInitializer에서 데이터베이스를 Drop하고 다시 만들도록 되어 있었는데..이걸 약간 수정해보자..(데이터베이스 드롭되면 기존 데이터 다 날라가니..아무래도 좀..)

public class SL5_BOARD_DBCONTEXTInitializer
        : CreateDatabaseIfNotExists<SL5_BOARD_DBCONTEXT>

이렇게 변경해 놓으면 데이터베이스 파일이 존재 하지 않을 때만 새로 만들어 준다.

에..그럼 기존 데이터베이스를 보존할려면 수동으로 스키마를 수정해야하는데..Server Explorer를 열어서 SL5_BOARD.sdf 파일을 연결 하고 Tables을 열어서 BOARD_LIST를 오른쪽 마우스로 클릭하면 Edit Table Schema를 선택하고, LIST_CONTEXT의 Data Type을 ntext로 변경하고 OK를 눌러주면 된다.



위의 그림을 참고해서 수정한다.

2. 글쓰기 버튼 클릭~

BoardListViewModel.cs 일부 소스

ICommand addCommand;
/// <summary>
/// 추가 커맨드
/// </summary>
public ICommand AddCommand
{
    get
    {
        if (addCommand == null)
        {
            addCommand = new ActionCommand(() =>
            {
                BOARD_LIST obj = new BOARD_LIST();
                obj.BOARD_MAIN_IDX = BoardMain.CurrentData.BOARD_MAIN_IDX;

                //요기 1은 나중에 로그인 기능이 추가되면 로그인 유저 아이디로 변경
                obj.MST_MEMBER_IDX = 1;
                BoardListData.Adding(obj);

                //수정 상태로 바로 변경

                IsEditting = true;
            });
        }
        return addCommand;
    }
}

BoardList.cs 일부소스

/// <summary>
/// 추가 함수
/// </summary>
/// <param name="addData">BOARD_LIST</param>
public void Adding(Object addData)
{
    if (addData != null && addData is BOARD_LIST)
    {
        BOARD_LIST item = addData as BOARD_LIST;

        //요기 등록일시 넣는 부분과 등록자 아이디 넣는 부분 차후에 위치 변경 예정
        item.REG_DT = DateTime.Now;
        item.REG_IDX = 1;

        //컨텍스트에 넣궁

        BoardDomainService.Context.BOARD_LISTs.Add(item);

        //컨디션데이터에도 넣구
        ConditionData.Add(item);

        //현재 데이터에 넣는다 -> 이렇게 넣으면 화면 변경되는 거 알죠?
        CurrentData = item;

        MessageData = "추가 작업을 완료 했습니다.";
    }
    else
    {
        MessageData = "데이터가 없거나 형식이 다릅니다.";
    }
}


3. 저장 버튼 클릭

리치텍스트 박스의 xaml 프로퍼티는 직접 바인딩을 해보니 오류가 난다;; 그래서 시간 관계상 패수~ ㅋ

ICommand saveCommand;
/// <summary>
/// 저장 커맨드
/// </summary>
public ICommand SaveCommand
{
    get
    {
        if (saveCommand == null)
        {
            saveCommand = new ActionCommand(item =>
            {
                RichTextBox rtb = item as RichTextBox;
                if (rtb != null)
                {

                    //현재 데이터에 LIST_CONTEXT에 리치텍스트박스 xaml프로퍼티 값을 바로 넣음
                    BoardListData.CurrentData.LIST_CONTENT = rtb.Xaml;

                    //그리고 저장
                    BoardListData.Saving();
                }

                //편집상태는 false로
                IsEditting = false;
            });
        }
        return saveCommand;
    }
}


BoardList.cs 일부

/// <summary>
/// 저장 함수
/// </summary>
public void Saving()
{

    //나중에 여기도 좀 바꿔야 하는뎅..에..이번에는 그냥 평범하게..
    BoardDomainService.Context.SubmitChanges(submitCallBack, null);
}

요기는 특별히 할일은 없음

4. 조회 시
뷰모델에 있는 BoardListData의 프로퍼티 체인지 이벤트를 이용해서 CurrentData가 변경되면 그 데이터를 리치텍스트박스에 넣도록 코딩함.

BoardListDetailView.xaml.cs 일부

[Import(typeof(BoardListViewModel))]
public BoardListViewModel BoardListVM
{
    get
    {
        return this.DataContext as BoardListViewModel;
    }
    set
    {
        this.DataContext = value;
        value.BoardListData.PropertyChanged += new PropertyChangedEventHandler(BoardListData_PropertyChanged);
    }
}

void BoardListData_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    switch (e.PropertyName)
    {
        case "CurrentData":
            if (BoardListVM.BoardListData.CurrentData != null)
            {
                if (BoardListVM.BoardListData.CurrentData.LIST_CONTENT != null)
                    rtb.Xaml = BoardListVM.BoardListData.CurrentData.LIST_CONTENT;
                else
                    rtb.Blocks.Clear();
            }
            break;
    }
}

5. 프로그램이 좀 심플하고 깔끔하게 나오면 좋은데..^^;;; ..
당분간 한번 쭈욱~ 만들어서..한번에 쾅~하고 올려야 될 것 같다. 중간 중간 과정을 보여주기 위해서 여러번 나누어서 올리고 있는데.. 진도가 너무 앙나간다;; 지금 처럼 단계별로 올리는 것이 좋은 분들은 리플 남겨 주시면 현재 상태를 유지하고..무플인 경우에는 한번에 왕창 올리도록 하겠다. 으흐흐..왕창~~~~~~~~~~~~~

ps.첨부한 소스는 실버라이트 소스만 있습니다. 서버 소스는 포함되어 있지 않습니다. 참고하세요

반응형
댓글